acプログラムから呼び出される単純なアセンブリ関数FIDIVがあり、メモリオペランドを必要とする命令()を使用する必要があります。
値を移動[esp - 2]して次の命令で使用するのは安全ですか、それともスタックをそのように使用するのは決して安全ではありませんか?
多くの回避策があることを私は知っています、そして私は本当にもうこれを必要としないので、今それはただの好奇心です。
このようなオフセットを使用すると、スレッドに対するアクションがスタックに再度アクセスする必要があるときはいつでも、データが確実に破損する可能性があります。これは、割り込み、APC、コンテキストスイッチ、例外などの間に発生する可能性があります。代わりに、スタック上のスペースを実際に予約して、スタックへのポインターを保存する必要があります。
sub esp, 4 ; Allways move it 4 byte increments. x64 may need 8 bytes
mov eax, esp ; EAX points to your 4 byte buffer
add esp, 4 ; Restore allocation.
もちろん、必要なバイト数が少ない場合は、プッシュ命令の方がはるかに高速です。
push eax
mov eax, esp ; EAX points to a buffer properly alligned to system
安全ではありません。スタックの一部は、コンテキストスイッチ、割り込み、およびスレッドがほとんどまたはまったく知識や制御を持たないその他のことに使用される可能性があります。
ある種。別の関数を呼び出さない限り、または(Unixでは)シグナルが呼び出される限り、安全です。それでも、壊れやすいのでやめます。最初にespから減算してから、そのスペースを使用しても問題ありません。
割り込みやコンテキストスイッチについて心配する必要はありません。それらはカーネルスタックで発生します。スタックを変更してそれらを台無しにすることができれば、カーネルをクラッシュさせるのは簡単です。