2017-09-26 11 views
1

私はコンパイル:'push ebp' 'pop ebp'は使用されていませんが、削除するとコードが破損します。

" 
int x_add(int a, int b) 
{ 
    return a+b; 
} 
" 

" 
push ebp 
mov ebp,esp 
mov edx,[ebp+08] 
mov eax,[ebp+0c] 
pop ebp 
ret 
" 

私は"x_add(1, 1);"を実行すると、それは-1を返し をので、私は検索しようとしたコードを置き換え

" 
mov eax,[esp+0c] 
add eax,[esp+08] 
ret 
" 

までの組み立てを簡素化しました何が壊れたか

" 
push ebp 
mov eax,[esp+0c] 
add eax,[esp+08] 
pop ebp 
ret 
" 

は、1 + 1 = 2を返します。 ebpが最初にプッシュされ、コード内で使用されないと、最後にポップされるのはなぜですか?

+2

そのプッシュ/ポップなしでは、espの値に気づかなかったので、アドレス指定に使用されるオフセットはプッシュ/ポップとは異なりますか?あなたはこれをインタラクティブにデバッグしましたか?短いバージョン: 'push ebp'は' esp'を変更するので、プッシュ/ポップを削除した場合は、オフセットも調整する必要があります。 – WhozCraig

+0

ええ、デバッガにはちょっと新しいです。 IDAはglitchyで、コードブロックはコードを飛ばすとコードをスキップします。私はチートエンジンを使用しており、スタックポインタをチェックするとは思わなかった。 – CatOfBlades

+0

最適化を有効にしてコードをコンパイルすると、より簡単で理解しやすくなります。 –

答えて

7

使用しない場合は、押す必要はありません。

ebpを押したときに、最適化されたコードでは、元のオフセット0c08はどちらも でした。

何もプッシュしておらず、espの元の機能エントリ値がまだ残っている場合は、それぞれ0804を使用する必要があります。

関連する問題