私と2人の友人が非常に奇妙な問題を抱えています。私たちは小さなアセンブラ部分(プロセスを高速化するために使用されていた)の内部でアプリケーションにクラッシュを検出しました。今、私たちのmindbreakが何であるかASMの理解なぜこれはWindowsで動作しますか?
push ebp
mov ebp, esp
; do stuff here including sub and add on esp
mov esp,ebp
pop ebp
:正しくそれはのように記述する必要がある場合には
push ebp
mov ebp, esp
; do stuff here including sub and add on esp
pop ebp
:エラーがstackpointerをいじると最後にそれをリセットしないことによって引き起こされた、それはこのように見えました:なぜこれはWindowsで動作しますか?私たちはアプリケーションをクラッシュしたLinuxに移植したときにエラーを発見しました。 WindowsやAndroid(NDKを使用)では問題が発生していたため、このエラーは検出されませんでした。 Stackpointerのリカバリはありますか?スタックポインタの悪用に対する保護はありますか?
は変更はありますか? 'add'sと' pop'sが 'sub'sと' push'esのバランスをとっていれば、 'esp == ebp'はすでに済んでいるので、' mov esp、ebp'を省略する必要があります)。クラッシュした場合、明らかにバランスが取れていません。 WindowsとLinuxで同じアセンブラを使用していますか?異なるアセンブラは同じソースを異なるコードにアセンブルします。 (例えばNASMでは 'mov reg、symbol'は' mov reg、imm32'ですが、MASMでは負荷です。)ABIも32bitでもわずかに違います。 –
このアセンブラは別ファイルになっていますか、またはインライン化されていますか? –
@PeterCordes:いいえ、バランスが取れません。 Linuxの下で私のStackpointerは完全に盗まれています – Nidhoegger