我有一个从 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指令会快很多
push eax
mov eax, esp ; EAX points to a buffer properly alligned to system
这是不安全的 - 堆栈的一部分可能用于上下文切换、中断以及您的线程几乎或根本不知道或无法控制的其他事情。
有点。只要您不调用另一个函数,或者(在 Unix 上)调用信号,它就是安全的。不过,它会非常容易坏,所以我不会这样做。可以先从 esp 中减去,然后使用该空间。
您不必担心中断或上下文切换;这些发生在内核堆栈上。如果您可以通过更改堆栈来搞砸这些,那么使内核崩溃是微不足道的。