Ebp-4 局部变量开始
Ebp +0 原始ebp寄存器值
Ebp+4 返回值
Ebp+8形参1
Ebp+12 形参2
Ebp+16 形参3
局部变量1--->Ebp-4 局部变量开始
原始ebp寄存器值--->Ebp +0 原始ebp寄存器值
返回地址-->Ebp+4 返回值
形参1-->Ebp+8
形参2-->Ebp+12 形参2
打开栈帧:
Push Ebp;
Mov ebp,esp;
Sub esp,40(拉开栈)
几种寻址方式:
- 立即数寻址: mov eax,1;
- 寄存器寻址:mov eax,ebx;
- 存储器寻址:mov eax,[XXX]:(分为以下几种:)
1.寄存器直接寻址:mov eax,[1000];
2.寄存器间接寻址:mov eax,[ebx];
3.寄存器相对寻址:mov eax,[ebx+5]
4. 寄存器基址变址寻址:mov eax,[ebx+edi];
5.寄存器相对基址变址寻址:mov eax,[ebx+edi+5];
调用约定 | 关键字 | 参数入栈顺序 | 回收堆栈 |
---|---|---|---|
C-调用约定 | __Cdecl | 从右至左 | 调用者负责 |
标准调用规范 | __stdcall | 从右至左 | 被调用者负责 |
快速调用规范 | __fastcall | 从右至左 (使用寄存器传参) | 被调用者负责 |
Pascal调用规范 | pascal | 从左至右 | 被调用者负责 |
_cdecl:
_stdcall:
_fastcall:
_thiscall:
栈中局部变量布局:
函数举例:bar(z,y):