본문 바로가기

미분류

170316 Caller & Callee , 함수 호출 규약

1. Caller & Callee 




  • 호출 하는 놈 : Caller - main()
콜러가 저장하는 레지스터 ( caller-saved-register)
 : 콜러가 사용하기 전 반드시 백업해야 하는 레지스터, 콜리는 사용가능 
   값이 보존되지않아도 되는 경우는 백업하지 않을 수 있다.
☞ EAX, ECX, EDX
  • 호출 당한 놈 : 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