题
我有从C程序调用的简单的组装功能和我必须使用,需要一个存储器操作数指令(FIDIV
)。
它是安全的移动价值[esp - 2]
,并在下一条指令使用它,或者是它从来没有使用安全堆栈呀?
我知道有很多解决方法,我真的不需要这个了,所以现在它只是好奇。
解决方案
使用类似的偏移一定会数据暴露于腐败任何时间该线程上执行任何操作需要再次接触纸堆。这可以中断,装甲运兵车,上下文切换,异常等过程中出现你想要做的,而不是什么是在堆栈上实际预留空间和保存指向它。
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
其他提示
这不是安全 - 堆栈的一部分可以用于上下文切换,中断和其他可能的事情,你的线程有很少或没有的knowlege或控制权
。排序的。它是安全的,只要你不调用另一个函数,或(在UNIX上)有一个信号被调用。不过,这将是非常容易断裂,所以我不会去做。它是好的,虽然只从ESP第一减,然后使用该空间。
您不担心中断或上下文切换;那些发生在内核堆栈上。如果你能惹的改变堆栈的起来,这将是微不足道的崩溃内核。
不隶属于 StackOverflow