Assembly 为什么EAX的内容不同?
我有两种组装方法:Assembly 为什么EAX的内容不同?,assembly,x86,masm,Assembly,X86,Masm,我有两种组装方法: DWToHex PROTO:DWORD修改作为输入参数传递的类型为DWORD的二进制整数 内部EAX转换为十六进制表示形式,指针在单个参数内传递。它是用于调试目的的函数,工作正常 ProcA-PROTO:DWORD-除了破坏EAX的内容之外,什么都不做下面是代码: (很抱歉格式化-这里的常规代码格式化似乎不起作用) )######################################################################### )#####
DWToHex PROTO:DWORD
修改作为输入参数传递的类型为DWORD
的二进制整数
内部EAX
转换为十六进制表示形式,指针在单个参数内传递。它是用于调试目的的函数,工作正常ProcA-PROTO:DWORD
-除了破坏EAX
的内容之外,什么都不做下面是代码:
(很抱歉格式化-这里的常规代码格式化似乎不起作用).data
MsgBoxCaption4 db "before calling", 0
MsgBoxCaption5 db "after calling", 0
.data?
N DWORD ?
NTXT db 16 dup(?)
.code
mov eax, N
invoke cx_DWToHex, addr NTXT
invoke MessageBox, NULL, addr NTXT, addr MsgBoxCaption4, MB_OK ; show eax as hexadecimal
mov eax, N ; ***** point A ****
invoke ProcA, addr sdt ; ***** point B ****
; mov eax, N
invoke cx_DWToHex, addr NTXT
invoke MessageBox, NULL, addr NTXT, addr MsgBoxCaption5, MB_OK ; show eax as hexadecimal
徖
问题:
为什么B点A点中的
EAX
内容不同 用于调用ProcA
的invoke
指令应该获取“sdt”的地址,并将其推送到堆栈上。更可能的是,它生成的代码与
lea eax, sdt
push eax
call ProcA
这会破坏
eax
的内容。您可以通过查看生成代码的反汇编来验证这一点。您可以询问ProcA在不发布代码的情况下对eax做了什么。看起来它改变了eax。如果在点a上设置断点,那么实际上可以看到MessageBox的返回值。@HansPassant procA代码在粗体后面的(2)下方text@HansPassat,addrSTD不是方法的名称。拼写错误的方法名称是proc
,而不是procA
——我将对其进行编辑。这在stdcall约定下是完全可以的,因为不需要保留EAX(对于返回某些内容的函数,无论如何都会将其用作返回值)。
end
.data
MsgBoxCaption4 db "before calling", 0
MsgBoxCaption5 db "after calling", 0
.data?
N DWORD ?
NTXT db 16 dup(?)
.code
mov eax, N
invoke cx_DWToHex, addr NTXT
invoke MessageBox, NULL, addr NTXT, addr MsgBoxCaption4, MB_OK ; show eax as hexadecimal
mov eax, N ; ***** point A ****
invoke ProcA, addr sdt ; ***** point B ****
; mov eax, N
invoke cx_DWToHex, addr NTXT
invoke MessageBox, NULL, addr NTXT, addr MsgBoxCaption5, MB_OK ; show eax as hexadecimal
lea eax, sdt
push eax
call ProcA