0

我有两种组装方法:

  1. DWToHex PROTO:DWORDDWORD将作为输入参数内部传递的类型的二进制整数修改EAX为十六进制表示,指向在单个参数内部传递的指针。它是用于调试目的的功能,它工作正常。
  2. 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

..................................................... .........................................................

问: 为什么EAXin点A点和B点的内容不一样?

4

1 回答 1

1

invoke您用于调用的指令ProcA应该获取“sdt”的地址,并将其压入堆栈。很可能,它生成的代码类似于

lea eax, sdt
push eax
call ProcA

这会破坏eax. 您可以通过查看生成的代码的反汇编来验证这一点。

于 2012-04-20T21:35:25.340 回答