复习
-
PUSH & POP
SP 指向当前栈顶最后压入的一个字节
例子:- PUSH EAX (32bits)
假设压栈前SP = 0x0012ff40,则PUSH执行后,
0x0012ff3c~3f将用于存放EAX的值,
SP=SP-4,即SP修改为 0x0012ff3c - POP AX (16bits)
假设压栈前SP = 0x0012ff40,则POP执行后,
0x0012ff40~41的值拷贝入AX
SP=SP+2,即SP修改为 0x0012ff42
Tips: SP的修改意味着以前数据理论上不能访问了,但是该字节的内容并没有被擦除。
- PUSH EAX (32bits)
-
CALL & RET
例子:- CALL (导致ESP 修改-4/-8)
PUSH IP( a near or short call) / PUSH CS PUSH IP (far call)
JMP 跳转至被调用函数 - RET (导致ESP 修改+4,近调用)
POP IP - RETF(导致ESP 修改+8,对应far call)
POP IP POP CS
注:近转移 near/short call是同一代码段内转移,只需要变IP
远转移 far call是不同代码段间(调用另一个文件的代码段)转移,除了IP,还要改变CS
- CALL (导致ESP 修改-4/-8)