0

関数 foo を呼び出すには、c で記述されたものよりも適切な実装を選択する必要があります。foo は 1 つの引数 0x100fa500 を取得します。

最初の答えは次のとおりです。

sub esp,2
mov word[esp],0xa500
sub esp,2
mov word[esp] , 0x100f
call foo
add esp 4

そして2番目:

 sub esp,2
 mov word[esp],0x100f
 sub esp,2
 mov word[esp] , 0xa500
 call foo

なぜ2番目が正しいのですか?最初に正しいプッシュパラメーターを実装してから呼び出すと思います

4

2 に答える 2

3

add esp, 4Intel アーキテクチャはリトル エンディアンであるため、末尾の欠落を除けば、2 番目のバージョンは正しいものです。これは、DWORD がメモリに格納され、最下位の BYTE または WORD が下位のメモリ アドレスを占めることを意味します。あなたの場合0xA500は、DWORD の最下位の WORD であり、2 番目のバージョンはそれをスタックの 4 バイト領域の下位 2 バイトに正しく配置します。

于 2012-07-01T16:49:47.663 に答える
0

呼び出し規約に依存しますが、「cdecl」の場合、スタックをクリーンアップするのは呼び出し元次第です。つまり、「esp、4を追加」するため、正しいのは最初の答えです。ただし、彼の回答でndkrempelが通知したように、パラメーターは2番目の回答のようにリトルエンディアンとして渡す必要があります。

http://en.wikipedia.org/wiki/X86_calling_conventions

于 2012-07-01T16:49:28.693 に答える