lm68140318 发表于 2023-12-1 14:28:16

函数参数指针


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指向 而不是   ??






FishC_GPT 发表于 2023-12-1 14:28:27

add esp, 0FFFFFFF8的目的是为了将esp的值减去8,使得它指向当前函数堆栈中的参数地址。在这个例子中,由于有两个DWORD类型的参数(每个占4个字节),所以需要将esp指针向上减少8个字节,以便正确访问这两个参数。

0xFFFFFF8是一个十六进制补码数,等于-8。当执行add esp, 0xFFFFFF8时,实际上是将esp的值减去8。通过这样的操作,esp会指向参数首地址,即第一个参数存储的位置。由于参数是从低地址向高地址依次存储的,所以esp指向的是最后一个参数的地址。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

人造人 发表于 2023-12-1 15:21:33

加一个负数等于减一个正数
add esp, 0FFFFFFF8
add esp, -8
sub esp, 8

人造人 发表于 2023-12-6 12:13:19

这看起来是真的把我拉黑了,算了,无所谓了

lm68140318 发表于 2023-12-11 14:49:43

人造人 发表于 2023-12-6 12:13
这看起来是真的把我拉黑了,算了,无所谓了

谁把你拉黑了 ??
页: [1]
查看完整版本: 函数参数指针