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が最初にプッシュされ、コード内で使用されないと、最後にポップされるのはなぜですか?
そのプッシュ/ポップなしでは、espの値に気づかなかったので、アドレス指定に使用されるオフセットはプッシュ/ポップとは異なりますか?あなたはこれをインタラクティブにデバッグしましたか?短いバージョン: 'push ebp'は' esp'を変更するので、プッシュ/ポップを削除した場合は、オフセットも調整する必要があります。 – WhozCraig
ええ、デバッガにはちょっと新しいです。 IDAはglitchyで、コードブロックはコードを飛ばすとコードをスキップします。私はチートエンジンを使用しており、スタックポインタをチェックするとは思わなかった。 – CatOfBlades
最適化を有効にしてコードをコンパイルすると、より簡単で理解しやすくなります。 –