2012-04-20 65 views
0

我有2种装配方法:为什么EAX的内容不同?

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

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

问题: 为什么EAX的内容在B点的A点不一样?

+0

你问什么ProcA没有公布其代码没有对eax做什么。看起来它改变了EAX。如果你在A点上设置断点,那么你实际上可以看到MessageBox的返回值。 – 2012-04-20 21:26:02

+0

@HansPassant procA代码在粗体文本后贴上(2) – aviad 2012-04-20 21:32:46

+0

为什么命名为“addrSTD”? – 2012-04-20 21:35:31

回答

1

用于调用ProcAinvoke指令应该获取'sdt'的地址,并将其推送到堆栈上。更可能,它生成类似的代码

lea eax, sdt 
push eax 
call ProcA 

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

+0

在stdcall约定下,这是完全可以的,因为EAX不需要被保留(对于返回值的函数总是用于返回值)。 – 2012-04-21 00:26:23

相关问题