社区
汇编语言
帖子详情
到底是传了址还是传了值?
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
请问这两段代码,最终压入栈的东西是否一样?
...全文
69
9
打赏
收藏
到底是传了址还是传了值?
LEA EAX,DWORD PTR SS:[EBP-C] PUSH EAX --------------------------------------- PUSH DWORD PTR SS:[EBP-C] 假如 DWORD PTR SS:[EBP-C] = 123456h 请问这两段代码,最终压入栈的东西是否一样?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 ; 怎么就不成了呢?
python
传
参时,
传
的是
值
还是地
址
?
Python是不允许程序员选择采用
传
值
还是
传
址
的。Python参数
传
递采用的肯定是“
传
对象引用”的方式。实际上,这种方式相当于
传
值
和
传
址
的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改...
Java
到底
是
值
传
递还是
址
传
递
Java只有
值
传
递,不过基本数据类型
传
递的是
值
本身引用数据类型
传
递的是对象地
址
。
java
值
传
递与
址
(引用)
传
递
如果参数是基本类型(
传
“实际
值
”): 由于栈中存的就是“实际
值
”(java基本类型的
值
存储在栈中,不在堆中),所以
传
递的是基本类型的“实际
值
”的拷贝。 如果参数是引用类型(
传
“地
址
值
”): 由于栈中存...
python
传
参数是
传
值
还是
传
址
?
Python中函数参数是引用
传
递(注意不是
值
传
递)。对于不可变类型(数
值
型、字符串、元 组),因变量不能修改,所以运算不会影响到变量自身;而对于可变类型(列表字典)来 说,函数体运算可能会更改
传
入的参数变量。...
Js函数参数,
传
递的是
值
还是地
址
? 都是
传
值
!!!
普通数据类型
传
递的是
值
/** * 全局作用域、函数变量、函数内部作用域 * */ let a = 10 let b = 1 function sum(a, b){ a = 11 b = 2 console.log(a) // 11 console.log(b) // 2 } console.log(a) // 10...
汇编语言
21,497
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章