我有两种装配方法:
DWToHex PROTO:DWORD
修改输入参数中传递的类型DWORD
的二进制整数
将EAX
内部转换为十六进制表示形式,在单个参数内传递指针。它是用于调试目的的函数,它工作正常。ProcA PROTO:DWORD
- 除了破坏以下EAX
内容之外什么都不做是代码:
(抱歉格式化-c似乎常规代码格式在这里不起作用) ################################################## #######################
`.386 ; set processor type`
`.model flat, stdcall ; memory model & calling convention`
`option casemap :none ; case sensitive`
`.code`
################################################## #######################
procA public addrSTD:DWORD
ret
ProcA endp
################################################## #######################
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
............................................... ............................................
问题:
为什么B点A点EAX
的内容不一样?
答案 0 :(得分:1)
用于调用invoke
的{{1}}指令应该获取'sdt'的地址,并将其推送到堆栈上。它很可能会生成类似于
ProcA
破坏lea eax, sdt
push eax
call ProcA
的内容。您可以通过查看生成代码的反汇编来验证这一点。