Notice
Recent Posts
Recent Comments
Link
- 참치군
- ?
- stalk.io
- :: 2013년, 스리는 여섯살
- 웹 강좌
- 점프 투 파이썬
- 요니나의 대학생 재테크
- This is CS50
- 애자일 이야기
- isao의 IT,게임번역소
- 소프트웨어 이야기
- Color Scripter
- 어디를 가든지 마음을 다해 가라
- VisuAlgo
- 서울대 평생교육원
- 몽환
- RegExr: Learn, Build, & Test R…
- Hello, Stranger :D
- I Like Exploit
- Z3alous Security Story
- Project Euler
- Blog
- pieces of code
- window 쪼물딱 거리기
- IT - Informatics Alphabet
- rop
- 국제 정보교육센터 I2sec 대구 1기
- This is the moment. :)
- blackmoon
- z3alous는 세상에 소리 z3alous~
- Acord
- FORENSIC-PROOF
- 어셈블리
- Outsider's Dev Story
- Open Tutorials
- 코드라이언
- 컴퓨터 그래픽스와 3D 프린팅
- HACKABILITY
- Lee, Jae-Hong
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 컴파일러
- C언어
- 블루블랙
- 발표
- Hello World
- 버퍼오버플로우
- 염색
- 레지스터
- Wireshark
- 호출규약
- Packet
- BOF
- 파이썬
- 디버깅
- 동대구
- 오지총
- ubuntu
- 펌
- 공간복잡도
- Visual Studio
- 소켓
- 알고리즘
- 창의공학설계
- 시간복잡도
- 탈색
- 피보나치
- 베이스
- Debug
- 추상데이터타입
- Calling Convention
Archives
- Today
- Total
c0smicb0y
Calling Convention (호출규약) 본문
스택을 이용하여 파라미터를 전달할 때 스택에 파라미터를 어떠한 순서로 넣을 것이며 또한 전달되어진 파라미터를 어느 곳에서 해제할 것인가에 따라 여러 가지 방식이 잇으며, 이를 Calling Convention(호출규약)이라고 부른다.
__cdecl
이 Calling Convention은 C, C++ 프로그램에서 파라미터 전달 시 기본적으로 사용되는 방식으로, 파라미터 전달은 오른쪽에서 왼쪽으로 이루어지며, 프로시저를 호출한 쪽(Caller)에서 파라미터에 대한 해제까지 책임져주게 된다.
1 2 3 4 5 6 7 8 | main(){ sum(1, 2); } int sum(int a, int b) { return a + b; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | main: push 2 push 1 call sum add esp, 8 sum: push ebp mov ebp, esp mov eax, dword ptr [ebp + 0x8] add eax, dword ptr [ebp + 0xc] pop ebp ret | cs |
main 어셈블리 코드에서 call sum 이후 add esp, 8로 파라미터에 대한 해제까지 해주는 것을 볼 수 있다.
__stdcall
Windoiws API의 프로시저에서 사용하는 Calling Convention으로 파라미터 전달은 __cdecl 방식과 동일하게 오른쪽에서 왼쪽 방향이지만, 파라미터의 해제는 프로시저가 복귀되기 전에 Callee에 의해 이루어진다.
1 2 3 4 5 6 7 8 | main(){ sum(1, 2); } int __stdcall sum(int a, int b) { return a + b; } | cs |
1 2 3 4 5 6 7 8 9 10 11 | main: push 2 push 1 call sum sum: push ebp mov ebp, esp mov eax, dword ptr [ebp + 0x8] add eax, dword ptr [ebp + 0xc] pop ebp ret 8 | cs |
sum의 내부 루틴에서 ret 8을 통해 파라미터의 해제가 이루어지고 있다.
__fastcall
__fastcall은 처음 두 개의 파라미터까지는 스택을 사용하지 않고 ecx와 edx 레지스터를 사용하며 그 이상의 파라미터에 대해서는 오른쪽에서 왼쪽 방향으로 스택에 저장한다. 파라미터의 해제는 __stdcall과 동일하다.
'프로그래밍 > Windows' 카테고리의 다른 글
Child Process를 디버깅하는 방법 (0) | 2015.11.21 |
---|---|
VC 컴파일러 환경 변수 설정 (0) | 2015.11.13 |
함수에서의 레지스터 사용 (0) | 2015.11.04 |
ShellExecute vs CreateProcess (0) | 2015.10.02 |
Comments