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

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

你可能感兴趣的:(函数栈帧以及调用约定相关的一些总结)