SlideShare une entreprise Scribd logo
1  sur  3
Télécharger pour lire hors ligne
Function Calling Convention



함수를 호출하기 위해서는 실행할 함수의 주소 값 그리고 그 주소 값을 가져올 수
있는 함수 이름, 현재 처리되고 있는 함수의 정보를 저장할 공간, 함수의 실행이 끝
난 뒤 리턴 받을 공간, 함수의 실행에 필요한 인자를 넘겨줄 공간이 등이 필요 할
것이다.


main 함수에서 다른 함수로 실행이 넘어간 뒤에 다시 원래의 main 함수로 돌아오
려면 호출자가 사용하던 데이터를 복구할 필요가 있다. 함수를 연달아서 호출한 경
우 나중에 호출된 함수의 데이터는 항상 호출한 함수의 데이터보다 먼저 제거된다.
함수 호출에 관련된 데이터의 이런 특성이 스택이 갖는 속성들과 맞기 때문에 함수
호출 과정에서 현재 함수에서 사용 하는 로컬 변수나 호출될 함수에게 전달한 인자
를 저장하기 위한 데이터 구조에서 스택(Stack)을 주로 사용 한다.


함수 호출 규약은 함수를 호출할 때 인자를 넘겨주는 방식과 함수를 다사용한 후에
스택에 있던 인자를 제거하는 방식으로 나눌 수 있다.
하수 호출 규약을 위 방법대로 나누면 5가지 __cdecl, __stdcall, __fastcall,
thiscall, naked 가 있다.


 호출 규약            인수 전달               스택 정리     이름 규칙
 __cdecl          오른쪽부터               호출원       _함수명
 __stdcall        오른쪽부터               함수        _함수명@인수크기
                  ECX, EDX에    처음
 __fastcall       2개 전달, 나머지는         함수        @함수명@인수크기
                  오른쪽 먼저
                  오른쪽부터,      this를             C++   이름   규칙을
   thiscall                           함수
                  ECX에 저장                       따름
   naked          오른쪽부터               함수        없음


                                                      표출처:winapi


자주 쓰이는 cdecl방식과 stdcall방식을 실제로 코딩하여 디버깅 해서 확인해 보겠
습니다.
cdecl

3:    int add(int a, int b)
0040B4F0     push             ebp           <--add() 시작
0040B4F1     mov              ebp,esp
0040B4F3     sub              esp,40h
0040B4F6     push             ebx
0040B4F7     push             esi
0040B4F8     push             edi


9:    int main(int argc, char* argv[])
00401050     push             ebp                  <--main() 시작
00401051     mov              ebp,esp
00401053     sub          esp,40h
00401056     push             ebx
00401057     push             esi
00401058     push             edi
11:        add(1,2);
00401068     push             2
0040106A     push             1
0040106C     call         @ILT+0(add) (00401005)     <--add() 호출
00401071     add              esp,8                  <--Stack 정리
12:        return 0;
00401074     xor          eax,eax


00401071주소를 보면 8byte만큼 ESP를 보정해 줍니다. -->(add(1,2))
cdecl 방식의 장점은 printf() 함수와 같이 가변길이 파라미터를 전달 할 수 있다는
것입니다.(ex>printf 같은 함수가 가변 인수가 전달되는 경우인데, printf는 몇 개의 인수가
         전달되는 정해져 있지 않습니다. 몇 개의 인수가 전달되는지 알 수가 없기 때에
         호출하는 쪽에서 판단하는 편이 유용합니다.)
stdcall
3:    int _stdcall add(int a, int b)              <-- add() 시작
0040B7D0      push          ebp
0040B7D1      mov              ebp,esp
0040B7D3      sub          esp,40h
0040B7D6      push          ebx
0040B7D7      push          esi
0040B7D8      push          edi
       .
       .

0040B80D      pop           ebp
0040B80E      ret          8                      <-- 스택정리


9:    int main(int argc, char* argv[])            <-- main() 시작
00401050     push          ebp
00401051     mov            ebp,esp
00401053     sub           esp,40h
00401056     push          ebx
00401057     push          esi
00401058     push          edi
11:        add(1,2);                               <-- add() 호출
00401068     push          2
0040106A      push         1
0040106C      call        @ILT+10(add) (0040100f)
       .
       .

00401082     pop           ebp
00401083     ret


스택의 정리는 add() 0040B80E 주소에서 RET 8 명령에서 수행됩니다.
 RET 8 명령의 의미는 RET + POP 입니다. 즉, 리턴 후 지정된 크기만큼 ESP
를 증가시키는 것입니다.
stdcall 방식의 장점은 호출되는 함수(Callee) 내부에 스택 정리 코드가 존재하므로
 함수 호출할 때마다 ADD ESP, XXX 명령을 써줘야 하는 cdecl 방식에 비해서 코
드 크기가 작아집니다.


참고한 사이트:http://www.reversecore.com,http://beforu.egloos.com/2117375
Copyright ⓒ 2011. 육승찬. All rights Reserved

Contenu connexe

Tendances

(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
 
Macro & compilation
Macro & compilationMacro & compilation
Macro & compilationIkhoon Eom
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Circulus
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료욱진 양
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401guest91f89d83
 
Java mentoring of samsung scsc 3
Java mentoring of samsung scsc   3Java mentoring of samsung scsc   3
Java mentoring of samsung scsc 3도현 김
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Reverse Engineering 2015.02.09
Reverse Engineering 2015.02.09Reverse Engineering 2015.02.09
Reverse Engineering 2015.02.09fromitive
 

Tendances (20)

(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
javascript02
javascript02javascript02
javascript02
 
Boost
BoostBoost
Boost
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
Macro & compilation
Macro & compilationMacro & compilation
Macro & compilation
 
Any(some),all,exists(2)
Any(some),all,exists(2)Any(some),all,exists(2)
Any(some),all,exists(2)
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
14. fiile io
14. fiile io14. fiile io
14. fiile io
 
8 swift 중첩함수
8 swift 중첩함수8 swift 중첩함수
8 swift 중첩함수
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료골때리는 자바스크립트 발표자료
골때리는 자바스크립트 발표자료
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
 
Java mentoring of samsung scsc 3
Java mentoring of samsung scsc   3Java mentoring of samsung scsc   3
Java mentoring of samsung scsc 3
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Reverse Engineering 2015.02.09
Reverse Engineering 2015.02.09Reverse Engineering 2015.02.09
Reverse Engineering 2015.02.09
 
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
(오라클SQL기초강좌)상관 서브쿼리(Correlated Sub Query)
 

Similaire à Function calling convention

Python + Excel
Python + Excel Python + Excel
Python + Excel POSTECH
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2Jinkyoung Kim
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1YEONG-CHEON YOU
 
[170517 5주차]C언어 A반
[170517 5주차]C언어 A반[170517 5주차]C언어 A반
[170517 5주차]C언어 A반arundine
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue[Swift] Data Structure - Dequeue
[Swift] Data Structure - DequeueBill Kim
 
Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)one_two_12
 
파이썬2.7 기초 공부한 것 정리
파이썬2.7 기초 공부한 것 정리파이썬2.7 기초 공부한 것 정리
파이썬2.7 기초 공부한 것 정리Booseol Shin
 
제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀EXEM
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
Taocp 1.4.1 subroutine
Taocp 1.4.1 subroutineTaocp 1.4.1 subroutine
Taocp 1.4.1 subroutineYoungkwon Lee
 
Eddy_description.pptx
Eddy_description.pptxEddy_description.pptx
Eddy_description.pptxKim Sanghoon
 
코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)
코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)
코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)유익아카데미
 
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이GangSeok Lee
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기Yong Joon Moon
 
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229Yong Joon Moon
 

Similaire à Function calling convention (20)

Python + Excel
Python + Excel Python + Excel
Python + Excel
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1
 
[170517 5주차]C언어 A반
[170517 5주차]C언어 A반[170517 5주차]C언어 A반
[170517 5주차]C언어 A반
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue
 
Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)Buffer Overflow PPT (OneTwo)
Buffer Overflow PPT (OneTwo)
 
파이썬2.7 기초 공부한 것 정리
파이썬2.7 기초 공부한 것 정리파이썬2.7 기초 공부한 것 정리
파이썬2.7 기초 공부한 것 정리
 
제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 10회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
Ch10
Ch10Ch10
Ch10
 
Taocp 1.4.1 subroutine
Taocp 1.4.1 subroutineTaocp 1.4.1 subroutine
Taocp 1.4.1 subroutine
 
4. stack
4. stack4. stack
4. stack
 
Eddy_description.pptx
Eddy_description.pptxEddy_description.pptx
Eddy_description.pptx
 
코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)
코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)
코딩인카페 C&JAVA 기초과정 컴퓨터와 프로그래밍 소개(3)
 
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
[2012 CodeEngn Conference 07] nesk - Defcon 20th : 본선 CTF 문제풀이
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기
 
3.2 실행계획 sql 연산 (concatenation)
3.2 실행계획 sql 연산 (concatenation)3.2 실행계획 sql 연산 (concatenation)
3.2 실행계획 sql 연산 (concatenation)
 
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 

Function calling convention

  • 1. Function Calling Convention 함수를 호출하기 위해서는 실행할 함수의 주소 값 그리고 그 주소 값을 가져올 수 있는 함수 이름, 현재 처리되고 있는 함수의 정보를 저장할 공간, 함수의 실행이 끝 난 뒤 리턴 받을 공간, 함수의 실행에 필요한 인자를 넘겨줄 공간이 등이 필요 할 것이다. main 함수에서 다른 함수로 실행이 넘어간 뒤에 다시 원래의 main 함수로 돌아오 려면 호출자가 사용하던 데이터를 복구할 필요가 있다. 함수를 연달아서 호출한 경 우 나중에 호출된 함수의 데이터는 항상 호출한 함수의 데이터보다 먼저 제거된다. 함수 호출에 관련된 데이터의 이런 특성이 스택이 갖는 속성들과 맞기 때문에 함수 호출 과정에서 현재 함수에서 사용 하는 로컬 변수나 호출될 함수에게 전달한 인자 를 저장하기 위한 데이터 구조에서 스택(Stack)을 주로 사용 한다. 함수 호출 규약은 함수를 호출할 때 인자를 넘겨주는 방식과 함수를 다사용한 후에 스택에 있던 인자를 제거하는 방식으로 나눌 수 있다. 하수 호출 규약을 위 방법대로 나누면 5가지 __cdecl, __stdcall, __fastcall, thiscall, naked 가 있다. 호출 규약 인수 전달 스택 정리 이름 규칙 __cdecl 오른쪽부터 호출원 _함수명 __stdcall 오른쪽부터 함수 _함수명@인수크기 ECX, EDX에 처음 __fastcall 2개 전달, 나머지는 함수 @함수명@인수크기 오른쪽 먼저 오른쪽부터, this를 C++ 이름 규칙을 thiscall 함수 ECX에 저장 따름 naked 오른쪽부터 함수 없음 표출처:winapi 자주 쓰이는 cdecl방식과 stdcall방식을 실제로 코딩하여 디버깅 해서 확인해 보겠 습니다.
  • 2. cdecl 3: int add(int a, int b) 0040B4F0 push ebp <--add() 시작 0040B4F1 mov ebp,esp 0040B4F3 sub esp,40h 0040B4F6 push ebx 0040B4F7 push esi 0040B4F8 push edi 9: int main(int argc, char* argv[]) 00401050 push ebp <--main() 시작 00401051 mov ebp,esp 00401053 sub esp,40h 00401056 push ebx 00401057 push esi 00401058 push edi 11: add(1,2); 00401068 push 2 0040106A push 1 0040106C call @ILT+0(add) (00401005) <--add() 호출 00401071 add esp,8 <--Stack 정리 12: return 0; 00401074 xor eax,eax 00401071주소를 보면 8byte만큼 ESP를 보정해 줍니다. -->(add(1,2)) cdecl 방식의 장점은 printf() 함수와 같이 가변길이 파라미터를 전달 할 수 있다는 것입니다.(ex>printf 같은 함수가 가변 인수가 전달되는 경우인데, printf는 몇 개의 인수가 전달되는 정해져 있지 않습니다. 몇 개의 인수가 전달되는지 알 수가 없기 때에 호출하는 쪽에서 판단하는 편이 유용합니다.)
  • 3. stdcall 3: int _stdcall add(int a, int b) <-- add() 시작 0040B7D0 push ebp 0040B7D1 mov ebp,esp 0040B7D3 sub esp,40h 0040B7D6 push ebx 0040B7D7 push esi 0040B7D8 push edi . . 0040B80D pop ebp 0040B80E ret 8 <-- 스택정리 9: int main(int argc, char* argv[]) <-- main() 시작 00401050 push ebp 00401051 mov ebp,esp 00401053 sub esp,40h 00401056 push ebx 00401057 push esi 00401058 push edi 11: add(1,2); <-- add() 호출 00401068 push 2 0040106A push 1 0040106C call @ILT+10(add) (0040100f) . . 00401082 pop ebp 00401083 ret 스택의 정리는 add() 0040B80E 주소에서 RET 8 명령에서 수행됩니다. RET 8 명령의 의미는 RET + POP 입니다. 즉, 리턴 후 지정된 크기만큼 ESP 를 증가시키는 것입니다. stdcall 방식의 장점은 호출되는 함수(Callee) 내부에 스택 정리 코드가 존재하므로 함수 호출할 때마다 ADD ESP, XXX 명령을 써줘야 하는 cdecl 방식에 비해서 코 드 크기가 작아집니다. 참고한 사이트:http://www.reversecore.com,http://beforu.egloos.com/2117375 Copyright ⓒ 2011. 육승찬. All rights Reserved