2016-08-19 9 views
3

私はアセンブリコードを "Reverse Engineering for Beginners"という本を通して理解しようとしています[LINK]。私がかなり理解していないコードwin-32アセンブリコードがありました。関数のプロローグで `PUSH 0xFFFFFFFF`とは何を意味していますか?

main: 
    push 0xFFFFFFFF 
    call MessageBeep 
    xor eax,eax 
    retn 

最初のPUSH命令は何をしますか? 0xFFFFFFFFをスタックにプッシュするのはなぜですか? 0xFFFFFFFFの意味は何ですか?

ありがとうございます。あなたはこの関数は、スタックを利用したり、任意の保存レジスタを壊していないので、アセンブリコードは、実際に、任意のprolongueまたはエピローグを含んでいない

int main() { 
    MessageBeep(0xffffffff); 
    return 0; 
} 

のために同等のコードを見ている

+2

この場合に使用される呼び出し規約では、呼び出し先がスタックをクリーンアップする可能性があります。 – EOF

+7

[MessageBeep'のドキュメント(https://msdn.microsoft.com/en-us/library/windows/desktop/ms680356(v = vs.85).aspx)は、プッシュされた値がどのようなものであるかを示します。おそらくそれを読む努力の価値がある。 – WhozCraig

+0

http://stackoverflow.com/documentation/x86/3261/calling-conventions#t=201608201329248988454 –

答えて

12

、それを関数呼び出しを実行して0を返します(最後はeaxに入ります)。 は、cdecl呼び出し規約(呼び出し元が引数のクリーンアップを担当する場所)を使用している間は使用されない引数を受け取ることがあります。

MessageBeep、ほぼすべてのWin32 APIは、それがから、スタックのクリーンアップする責任があるという関数だということを意味し、(あなたがマクロWINAPIの後ろに隠れCの宣言でそれを見つけることができます)stdcall calling conventionを使用していますパラメータ。

コードでMessageBeepの唯一の引数として0xFFFFFFFFをプッシュして呼び出します。 MessageBeepは彼のことを行い、最終的にはすべての引数がスタックからポップされてから返されます(実際には、これには特別な形式のretがあります)。コードが制御を取り戻せば、スタックは引数をプッシュする前の状態になります。

+0

ありがとう!!わかった :) – Solidak

関連する問題