0

私には2つの組み立て方法があります:

  1. DWToHex PROTO:DWORDDWORD内部の入力パラメーターとして渡される型の2進整数EAXを、単一のパラメーター内で渡されるポインターである16進表現に変更します。これはデバッグ目的で使用される関数であり、正常に動作します。
  2. ProcA PROTO:DWORDEAX-以下 の内容を破壊する以外は何もしません:(フォーマットについては申し訳ありません-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 の内容が同じでないのはなぜですか?

4

1 に答える 1

1

invoke呼び出しに使用するディレクティブはProcA、「sdt」のアドレスを取得し、それをスタックにプッシュすることになっています。おそらく、次のようなコードを生成します

lea eax, sdt
push eax
call ProcA

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

于 2012-04-20T21:35:25.340 に答える