函数栈帧以及调用约定相关的一些总结

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:


image.png

image.png

_stdcall:


image.png

_fastcall:
image.png

_thiscall:
image.png

image.png
栈中局部变量布局:
image.png

image.png

image.png

image.png

函数举例:bar(z,y):


image.png

image.png
函数栈帧的一些总结:
image.png
image.png
image.png

image.png
image.png

image.png
image.png
image.png
image.png
image.png

image.png
image.png

image.png

image.png

image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容