3

このアセンブリ コードを見つけて分析したところ、スタックのクリーニングやバランス調整が行われていないことがわかりました。dword ptr [ebp-8]そして、おそらくスタックにアクセスすることは、コンテンツをポップすることと同じだと思いました。popいいえの場合、次のコードに指示が表示されないのはなぜadd esp, whateverですか??

_AddMe:
push ebp
mov ebp, esp
sub esp, 0ch
mov eax, dword ptr [ebp+0ch]
mov dword ptr [ebp-4], eax
mov eax, dword ptr [ebp+8]
mov dword ptr [ebp-8], eax
mov eax, dword ptr [ebp-8]
add eax, dword ptr [ebp-4]
mov dword ptr [ebp-0ch], eax
mov eax, dword ptr [ebp-0ch]
jmp AddMeEpilogue
AddMeEpilogue:
mov esp, ebp
pop ebp
ret
4

2 に答える 2

7

スタック ポインターは手動でインクリメントおよびデクリメントできるため、esp への加算/減算は基本的にプッシュおよびポップ操作と同様です。

mov eax, 2134
push eax
mov ebx, [esp]
add esp, 04    <-- This is the actual pop operation.
mov ecx, [esp-4]
ret

プッシュ後に pop を実行していないことがわかりますが、コードは正しく実行され、似ています。

push eax
pop ebx
mov ecx, ebx

スタックにアクセスしても、その正確性は変わりません。したがってmov eax, dword ptr [ebp-0ch]、スタックであるメモリから値をフェッチするだけなので、スタックが正しいか間違っているかを意味するわけではありません。ESP を増減するだけで、操作として考えられる意味がありpushますpop

于 2013-05-22T10:25:37.730 に答える
4

EBP関数に入るとスタックに保存され、現在のスタックの一番上を指すように設定されます ( mov ebp,esp)。

次に、スタック ポインターを下に移動することによって、ローカル変数用のスペースがスタックに割り当てられます ( sub esp,0ch)。その領域のデータは、EBP マイナスのオフセットを使用して参照されます (減算EBPに等しいため)。ESP

一方、関数の引数は、EBP プラスのオフセットを使用してアクセスされます。

関数が戻る前に、それを復元ESPし、EBP(関数の最初の直後の値にmov esp,ebp設定します)。ESPpush ebp

于 2013-05-22T10:36:59.773 に答える