1. Caller & Callee
- 호출 하는 놈 : Caller - main()
- 호출 당한 놈 : Callee - func()
콜리가 저장하는 레지스터 ( Callee-saved-register)
: 콜리가 사용하기 전 반드시 백업해야 하는 레지스터, 콜러는 사용 가능
콜리 입장에서는 콜러가 백업을 필요로하는 레지스터가 무엇인지 모르기 때문에 무조건 백업해야함.
☞ EBX, ESI, EDI, EBP
2. 함수 호출 규약(Calling Convention)
- cdelc : 콜러(Caller)가 스택을 정리
(C/C++에서 사용되는 기본적인 호출규약)
int sum(int a, int b){ return a+b; } int main(){ func(1,2); return 0; } |
push 1 push 2 call sum add esp, 8 ← 인자가 정리되는 부분 |
push 1, push 2 부분이 스택에 인자를 쌓는 부분이다.
call sum 에서 인자로 사용 되고 함수가 끝나면
add esp, 8 처럼 esp의 위치를 이동시켜 인자를 정리한다.
- stdcall : 콜리(Callee)가 스택을 정리
(win32 API에서 사용됨)
int _stdcall(int a, int b){ return a+b; } int main(){ sum(5,4); return 0; } |
<호출자 부분> push 4 push 5 call _stdcall ========================== <피호출자 부분> push ebp mov ebp, esp mov eax, dword ptr[ebp+0x8] add eax, dword ptr[ebp+0xc] mov esp, ebp pop ebp retn 8 |
호출자 부분에서 확인해보면 stdcall에서는 피호출자가 인자를 정리하기 때문에 호출자에서는 나타나지 않는다.
피호출자 부분에서 보면 pop ebp 후에 retn 8 로 인자를 정리하면서 종료 하는 모습을 볼 수 있다.
'미분류' 카테고리의 다른 글
170317 동적할당 과 malloc함수 (0) | 2017.03.19 |
---|---|
170316 어셈블리 언어 (0) | 2017.03.16 |
170314 리눅스, 우분투 설치 및 C 소양교육 (0) | 2017.03.16 |
170315 C (포인터, 반복문) (0) | 2017.03.16 |
170315 레지스터 (0) | 2017.03.16 |