2012-04-20 70 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

相關問題