鱼C论坛

 找回密码
 立即注册
查看: 343|回复: 4

[已解决]函数参数指针

[复制链接]
发表于 2023-12-1 14:28:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  1. EAX = 003EF884 EBX = 10101010 ECX = 00202020 EDX = 01021005 ESI = 01021005 EDI = 01021005 EIP = 01022046 ESP = 003EF814 EBP = 003EF81C EFL = 00000217



  2. TestProc Proc dwParam1:DWORD,bwParam1:DWORD
  3. 01022034  push        ebp                                                 ;保存ebp的值,函数执行完毕后需要恢复这个值
  4. 01022035  mov         ebp,esp                                          ;把当前的堆栈指针给ebp,保存esp的值,函数执行完毕后需要恢复这个值
  5.                 ;参数在调用函数前已经存入堆栈,从[EBP+8]、[EBP+C]、……开始
  6. 01022037  h add         esp,0FFFFFFF8                              ; esp指向参数地址 【在执行第一条指令之前esp指向参数首地址】
  7.                 local loc1:dword ,loc2:dword   ;
  8.                                
  9.                 mov ebx, dwParam1   
  10. 0102203A  mov         ebx,dword ptr [dwParam1]  
  11.                 mov loc1,ebx      
  12. 0102203D  mov         dword ptr [loc1],ebx  
  13.                 mov ecx,bwParam1
  14. 01022040  mov         ecx,dword ptr [bwParam1]  
  15.                 mov loc2,ecx
  16. 01022043  mov         dword ptr [loc2],ecx  
  17.                                                
  18.                 ret
  19. 01022046  leave  
  20. 01022047  ret         8  
  21.        
  22.         invoke TestProc,10101010h,202020h
  23. 0102204A  push        202020h                             ;保存参数
  24. 0102204F  push        10101010h  
  25. 01022054  call        TestProc (01022034h)  
  26.                



复制代码


我的问题:
参数在调用函数前已经存入堆栈,从[EBP+8]、[EBP+C]、……开始
add         esp,0FFFFFFF8   这条指令应该是让esp指向参数首地址
可是0FFFFFFF8=-8h,    那么esp指向[EBP-8] 而不是[EBP+8]     ??






最佳答案
2023-12-1 15:21:33
加一个负数等于减一个正数
add esp, 0FFFFFFF8
add esp, -8
sub esp, 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-1 15:21:33 | 显示全部楼层    本楼为最佳答案   
加一个负数等于减一个正数
add esp, 0FFFFFFF8
add esp, -8
sub esp, 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-6 12:13:19 | 显示全部楼层
这看起来是真的把我拉黑了,算了,无所谓了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-11 14:49:43 | 显示全部楼层
人造人 发表于 2023-12-6 12:13
这看起来是真的把我拉黑了,算了,无所谓了

谁把你拉黑了 ??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表