社区
汇编语言
帖子详情
到底是传了址还是传了值?
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
请问这两段代码,最终压入栈的东西是否一样?
...全文
93
9
打赏
收藏
到底是传了址还是传了值?
LEA EAX,DWORD PTR SS:[EBP-C] PUSH EAX --------------------------------------- PUSH DWORD PTR SS:[EBP-C] 假如 DWORD PTR SS:[EBP-C] = 123456h 请问这两段代码,最终压入栈的东西是否一样?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
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
打赏
举报
回复
结贴,加分
用户 昵称
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 ; 怎么就不成了呢?
传
值
与
传
址
本文通过示例代码详细解释了C语言中函数参数
传
递的两种方式——
传
值
与
传
址
的区别。
传
值
是将实参的
值
复制给形参,形参的修改不会影响实参;而
传
址
则是
传
递实参的内存地
址
,形参修改会影响实参。文中通过交换两个整数的
值
为例,展示了
传
址
在函数调用中的应用,帮助读者深入理解这两种
传
递方式的工作机制。
C语言中函数调用中的
传
值
与
传
址
本文详细解释了函数中
传
值
与
传
址
的区别,并通过两个示例代码对比展示了这两种方式如何影响参数。
传
值
方式下,函数内的修改不会影响原始变量;而
传
址
则会直接修改原变量。
传
值
与
传
址
的区别
本文通过实例解析C#中方法参数的
传
值
与
传
址
区别,包括
值
传
递无法改变实参
值
,而引用
传
递能直接影响实参。通过类比文件夹和文件的复制、快捷方式来帮助理解这一概念。
VBS中
传
值
与
传
址
的区别
在VB中调用函数或过程,
传
递参数有
传
址
和
传
值
两种方式,默认是
传
址
。概念上
传
址
是
传
内存地
址
,
传
值
是
传
具体数据。通过定义test1和test2函数实例分析,发现
传
址
会改变参数地
址
中的
值
,
传
值
则保持参数原
值
,二者对程序运算影响不同。
C语言的
传
值
和
传
址
的区别?
本文探讨了C语言中
传
值
和
传
址
两种参数
传
递方式的区别,包括它们在函数调用时如何影响变量的状态。同时,详细解析了形参和实参的概念及其在
传
值
和
传
址
中的作用。
汇编语言
21,500
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章