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

2018-03-04  本文已影响0人  bluewind1230
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(拉开栈)
几种寻址方式:
调用约定 关键字 参数入栈顺序 回收堆栈
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
上一篇 下一篇

猜你喜欢

热点阅读