'Programming/Assembly'에 해당되는 글 5건

  1. 2010.07.07 인자 전달에 사용된 스택 파괴
  2. 2010.07.07 Return Address
  3. 2010.07.07 어셈블리에서 사용되는 레지스터
  4. 2010.07.07 Inline Assembly
  5. 2010.07.07 어셈블리 기초 명령
2010. 7. 7. 10:21

- 호출자가 인자 전달에 사용된 스택을 파괴                                - 호출 당한 함수가 인자 전달에 사용된 스택을 파괴

segment    .data

segment    .text
       global _asm_main

__asm_main:

       push    10             ; 스택에 10추가.
       push    20             ; 스택에 20추가.

       call      asm_add    ; 함수 호출 .
                                 ; push asm_next
                                 ; jmp asm_add

       add      esp, 8        ; 스택 파괴.
                                  ; 위에서 8바이트 만큼 스택을
                                  ; 사용했기 때문에 8바이트만큼
                                  ; esp의 위치를 이동.
       ret

asm_add:
       mov    eax, [esp+4] ; []는 C언어에서 역참조 기능을
                                   ; 한다.
       mov    eax, [esp+8] ;
segment    .data

segment    .text
       global _asm_main

__asm_main:

       push    10             ; 스택에 10추가.
       push    20             ; 스택에 20추가.

       call      asm_add    ; 함수 호출 .
                                 ; push asm_next
                                 ; jmp asm_add

      
asm_add:
       mov    eax, [esp+4] ; []는 C언어에서 역참조 기능을
                                   ; 한다.
       mov    eax, [esp+8] ;
       ret      8




'Programming > Assembly' 카테고리의 다른 글

Return Address  (0) 2010.07.07
어셈블리에서 사용되는 레지스터  (0) 2010.07.07
Inline Assembly  (0) 2010.07.07
어셈블리 기초 명령  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:21

* 어셈블리에서는 함수를 호출 할 때 스택이나 레지스터에 함수 호출 후 돌아올 주소(Return Address)를 저장해 놔야 한다.
  아래 코드는 Return Address를 레지스터를 통해서 전달하는 경우와 스택을 통해서 전달하는 경우의 예제이다.

 - return address를 레지스터를 통해 전달하는 경우.                       - return address를 스택에 넣어 전달하는 경우.

segment .data          ; 전역변수를 만드는 곳.

segment .text           ; 함수를 만드는 곳.
    global _asm_main

__asm_main:

   mov ebx, asm_next  ; 돌아올 주소를 ebx에 넣는다.
   jmp asm_func         ; asm_func 함수 호출.

asm_next:
   ret

asm_func:
   mov eax, 100         
   jmp ebx                ;ebx레지스터에 있는 주소로
                            ;돌아간다.

segment .data           ; 전역변수를 만드는 곳.

segment .text            ; 함수를 만드는 곳.
    global _asm_main

__asm_main:

   push asm_next    
   jmp asm_func         ; asm_func 함수 호출.

asm_next:
   ret

asm_func:
   mov eax, 100        
   pop ebx              ; ebx = stack.pop()
   jmp ebx              ; ebx 레지스터에 있는 주소로
                           ; 돌아간다.

'Programming > Assembly' 카테고리의 다른 글

인자 전달에 사용된 스택 파괴  (0) 2010.07.07
어셈블리에서 사용되는 레지스터  (0) 2010.07.07
Inline Assembly  (0) 2010.07.07
어셈블리 기초 명령  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:20

* 어셈블리에서는 기본적으로 14개의 레지스터가 사용된다.
  그중에서 범용레지스터만 알아보자.

- EAX, EBX, ECX, EDX
32비트 16비트 HIGH byte LOW byte 용도
EAX AX AH AL 입출력과 거의 모든 산숭연산에 사용된다.
C에서 함수의 정수 반환값들이 여기에 저장된다.
(리턴값으로 사용)
EBX BX BH BL 일반적인 용도로 사용(돌아올 주소로 사용)
ECX CX CH CL 주로 파라미터로 사용
EDX DX DH DL

- ESI, EDI, ESP, EBP
32Bit 16Bit 용도
ESI SI 메모리 이동이나 비교 명령에서 SOURCE주소가 여기에 저장되다.
EDI DI 메모리 이동이나 비교 명령에서 Destination주소가 여기에 저장되다.
ESP SP 스택포인터. 시스템에 의해 자동으로 처리된다.
EBP BP 베이스/프레임 포인터. 프로시져의 Stack frame을 가지고 있다.

'Programming > Assembly' 카테고리의 다른 글

인자 전달에 사용된 스택 파괴  (0) 2010.07.07
Return Address  (0) 2010.07.07
Inline Assembly  (0) 2010.07.07
어셈블리 기초 명령  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:19
C++ 에서는 어셈블리 코드를 직접 호출할 수 있다. 이를 인라인 어셈블리라 한다.

#Include <stdio.h>
int foo()
{
    int ret = 10;
    __asm
    {
        mov    eax, ret;    // ret 변수를 eax 레지스터에 넣는다.
    }                            // eax 레지스터는 주로 리턴값으로 사용된다.  
                                  // c++에서 선언한 변수를 직접 사용할 수 있다.
}

void main()
{
    int n;
    
    foo();
    __asm
    {
        mov    n, eax        // 위함수에서 eax레지스터에 저장한 값을
    }                              // n변수로 불러온다.  
    printf( "%d\n", n );
}

'Programming > Assembly' 카테고리의 다른 글

인자 전달에 사용된 스택 파괴  (0) 2010.07.07
Return Address  (0) 2010.07.07
어셈블리에서 사용되는 레지스터  (0) 2010.07.07
어셈블리 기초 명령  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 7. 10:17
어셈블리어에서 가장 기본이 되는 명령들이다.
 - mov, add, sub, inc, dec

mov       eax, 1       ; eax 레지스터에 1을 대입한다.
mov       bx, ax       ;ax레지스터의 값을 bx레지스터에 대입한다.

add        eax, 1      ; eax = eax + 1
add        al, ah       ; al = al + ah                     

sub        bx, 10        ; bx = bx - 10
sub        ebx, edi     ; ebx = ebx - edi

inc        ecx            ; ecx++
dec        dl              ; dl--

'Programming > Assembly' 카테고리의 다른 글

인자 전달에 사용된 스택 파괴  (0) 2010.07.07
Return Address  (0) 2010.07.07
어셈블리에서 사용되는 레지스터  (0) 2010.07.07
Inline Assembly  (0) 2010.07.07
Posted by 어북어위크