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 어북어위크