CALL框架 pull pop EBP寄存器 栈底指针 ESP寄存器 栈顶指针

CALL框架
EBP寄存器 栈底指针
ESP寄存器 栈顶指针

1.EBP栈底指针
EBP时一个特殊的寄存器,通过EBP+偏移量可以访问CALL里边的局部变量
它的低16位叫BP。 //EAX和AX的关系

2.ESP栈顶指针
ESP栈顶指针与EBP栈底指针构成一段空间,一般就是本CALL局部变量的空间大小总和。
ESP指针配合EBP使用 //比如栈顶时1000 栈底是100就能在100-1000中找本CALL的局部变量

总结
(1)每个CALL会分配一个独立的栈段空间,供局部变量使用

(2)CALL栈平衡。进入CALL前与出CALL后,EBP和ESP的值不变

PUSH.POP和CALL栈平衡和retn指令

1.PUSH 入栈指令(压栈指令):
格式 :PUSH 操作数
相当于:
sub esb,4
mov [esp],ebp
操作数可以是寄存器,存储器,或者立即数

2.POP出栈指令 (弹栈指令)
格式:POP 操作数
相当于:
mov ebp,[esp]
add esp,4
操作数可以是寄存器,存储器,不能是立即数

3.代码分析
(1)测试PUSH和POP与ESP栈顶指针关系

(2)CALL和retn与ESP的关系
CALL执行时 会PUSH EIP
RETN 执行时 会POP EIP

(3)参数和局部变量的表示
          [EBP-??];    本call中的局部变量
          [EBP+??]     上一个call的局部变量,作为传入参数

十三.调用约定
配置属性–>c/C+±->高级----调用约定
1.cdecl调用约定
所有参数从右到左依次入栈,
这些参数由调用者清除,称为手动清栈

2.stdcall 调用约定
API函数调用约定 stdcall
stdcall时standardacll的缩写,时C++的标准调用方式:所有参考从右到左依次入栈
如果是调用类成员的话,最后一个入栈的是this指针

这些堆栈中的参数由被调用的函数返回后清除,使用的指令是retn X,
x表示参数占用的字节数(内存空间大小),cpu在retn之后自动弹出x

3.fastcall调用约定
编译器指定的快速调用方式
fastcall通常规定将前俩个(或者若干个)参数由寄存器传递,其余参数还是通过堆栈传递不同编译器编译的程序规定的寄存器不同。返回方式和stdcall的相同

猜你喜欢

转载自blog.csdn.net/ADADQDQQ/article/details/108432449
今日推荐