2012-04-20 13 views
0

I 2つの組立方法有する:EAXの内容が異なるのはなぜですか?

  1. DWToHex PROTO:DWORDは、単一のパラメータの内部に渡されるポインタれる16進表現へ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の戻り値が実際に表示されます。 –

+0

@HansPassant procAコードは、太字のテキストの直後(2)に掲載されています – aviad

+0

なぜ「addrSTD」という名前ですか? –

答えて

1

ProcAを呼び出すために使用するinvokeディレクティブは、 'sdt'のアドレスを取得してスタックにプッシュします。おそらく、

lea eax, sdt 
push eax 
call ProcA 

のようなコードを生成し、eaxの内容を破壊します。これは、生成されたコードの逆アセンブリを調べることで確認できます。

+0

EAXは保存する必要がないので(そして、何かを返す関数が戻り値として使用されるため)、stdcallの規約では完全に問題ありません。 –

関連する問題