到底是传了址还是传了值?

dacaiying 2008-03-21 11:23:58

LEA EAX,DWORD PTR SS:[EBP-C]
PUSH EAX
---------------------------------------
PUSH DWORD PTR SS:[EBP-C]

假如 DWORD PTR SS:[EBP-C] = 123456h

请问这两段代码,最终压入栈的东西是否一样?

...全文
57 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dacaiying 2008-03-22
  • 打赏
  • 举报
回复
我晕!!!
出于郁闷,我玩了看了半天电影, rad 也没关,就那么放着,刚才我又试了试,居然..........
晕死啊,居然又正常了,这次显示错误了
也就是说,我的代码又回归正常了; 这是为什么....
dacaiying 2008-03-22
  • 打赏
  • 举报
回复
00401000 /$ 55 PUSH EBP
00401001 |. 8BEC MOV EBP,ESP
00401003 |. 83C4 F4 ADD ESP,-0C
00401006 |. 6A 04 PUSH 4 ; /Length = 4
00401008 |. 68 AC304000 PUSH Hello.004030AC ; |Source = Hello.004030AC
0040100D |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; |Destination
00401010 |. E8 D1000000 CALL <JMP.&kernel32.RtlMoveMemory> ; \RtlMoveMemory
00401015 |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; /<%-d>
00401018 |. 68 0B304000 PUSH Hello.0040300B ; |Format = "%-d"
0040101D |. 68 B0304000 PUSH Hello.004030B0 ; |s = Hello.004030B0
00401022 |. E8 CB000000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
00401027 |. 83C4 0C ADD ESP,0C
0040102A |. 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040102C |. 68 B0304000 PUSH Hello.004030B0 ; |Title = ""
00401031 |. 68 B0304000 PUSH Hello.004030B0 ; |Text = ""
00401036 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401038 |. E8 BB000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA


dacaiying 2008-03-22
  • 打赏
  • 举报
回复
正是这样我才十分郁闷,我就不明白了怎么会是这样,我还以为api出错了
但不仅程序未报错,结果也是对的,我用od 看了,就是 PUSH DWORD PTR SS:[EBP-C]

.code

ShowCode proc

LOCAL kkk1
LOCAL kkk2
LOCAL kkk3


invoke RtlMoveMemory,kkk3,addr CallBackAddress,4
;一点问题没有,callbackaddress是一个全局变量
;callbackaddress 保存着一个函数的地址

invoke wsprintf,addr msgs,addr msg,kkk3

invoke MessageBox,0,addr msgs,addr msgs,48

showcode endp

start:
call showcode
exitprocess...
end ...

代码就是这样,我用的是radasm开发的
cnzdgs 2008-03-22
  • 打赏
  • 举报
回复
直接写kkk3是取kkk3变量的值,除非变量值与其地址相同,否则函数调用有可能不出错,但不会给kkk3赋值。你自己用调试工具看一下就知道了。
dacaiying 2008-03-22
  • 打赏
  • 举报
回复
那为什么 invoke RtlMoveMemory,kkk3,addr CallBackAddress,4 运行成功
成功的给 kkk3 赋值了??? 为什么?

如果此处换成 addr kkk3 也一样成功,为什么
dacaiying 2008-03-22
  • 打赏
  • 举报
回复
结贴,加分
智能卡_Snooper 2008-03-22
  • 打赏
  • 举报
回复
那有可能表示代码有更深层次的BUG。
cnzdgs 2008-03-22
  • 打赏
  • 举报
回复
LEA EAX,DWORD PTR SS:[EBP-C]
PUSH EAX
这是传地址

PUSH DWORD PTR SS:[EBP-C]
这是传值
dacaiying 2008-03-21
  • 打赏
  • 举报
回复
.data?
callbackaddress dd?
scode db 6 dup (?)


.code


local kkk3
invoke RtlMoveMemory,kkk3,addr CallBackAddress,4 ; 运行成功

invoke RtlMoveMemory,addr sCode,kkk3,4 ; 怎么就不成了呢?
发帖
汇编语言

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
帖子事件
创建了帖子
2008-03-21 11:23
社区公告
暂无公告