* 어셈블리에서는 함수를 호출 할 때 스택이나 레지스터에 함수 호출 후 돌아올 주소(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 |