函数参数指针
EAX = 003EF884 EBX = 10101010 ECX = 00202020 EDX = 01021005 ESI = 01021005 EDI = 01021005 EIP = 01022046 ESP = 003EF814 EBP = 003EF81C EFL = 00000217
TestProc Proc dwParam1:DWORD,bwParam1:DWORD
01022034push ebp ;保存ebp的值,函数执行完毕后需要恢复这个值
01022035mov ebp,esp ;把当前的堆栈指针给ebp,保存esp的值,函数执行完毕后需要恢复这个值
;参数在调用函数前已经存入堆栈,从、、……开始
01022037h add esp,0FFFFFFF8 ; esp指向参数地址 【在执行第一条指令之前esp指向参数首地址】
local loc1:dword ,loc2:dword ;
mov ebx, dwParam1
0102203Amov ebx,dword ptr
mov loc1,ebx
0102203Dmov dword ptr ,ebx
mov ecx,bwParam1
01022040mov ecx,dword ptr
mov loc2,ecx
01022043mov dword ptr ,ecx
ret
01022046leave
01022047ret 8
invoke TestProc,10101010h,202020h
0102204Apush 202020h ;保存参数
0102204Fpush 10101010h
01022054call TestProc (01022034h)
我的问题:
参数在调用函数前已经存入堆栈,从、、……开始
add esp,0FFFFFFF8 这条指令应该是让esp指向参数首地址
可是0FFFFFFF8=-8h, 那么esp指向 而不是 ??
add esp, 0FFFFFFF8的目的是为了将esp的值减去8,使得它指向当前函数堆栈中的参数地址。在这个例子中,由于有两个DWORD类型的参数(每个占4个字节),所以需要将esp指针向上减少8个字节,以便正确访问这两个参数。
0xFFFFFF8是一个十六进制补码数,等于-8。当执行add esp, 0xFFFFFF8时,实际上是将esp的值减去8。通过这样的操作,esp会指向参数首地址,即第一个参数存储的位置。由于参数是从低地址向高地址依次存储的,所以esp指向的是最后一个参数的地址。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。 加一个负数等于减一个正数
add esp, 0FFFFFFF8
add esp, -8
sub esp, 8
这看起来是真的把我拉黑了,算了,无所谓了 人造人 发表于 2023-12-6 12:13
这看起来是真的把我拉黑了,算了,无所谓了
谁把你拉黑了 ??
页:
[1]