使用esp以下的堆栈是否安全?

时间:2009-04-22 19:05:57

标签: assembly intel

我有一个从c程序调用的简单汇编函数,我必须使用需要内存操作数的指令(FIDIV)。

将值移动到[esp - 2]并在下一条指令中使用它是否安全,或者以这种方式使用堆栈是否安全?

我知道有很多变通方法,我真的不再需要这个了,所以现在只是好奇心。

3 个答案:

答案 0 :(得分:6)

使用类似的偏移量会在线程上的任何操作需要再次触及堆栈时将数据明确地暴露给损坏。这可能发生在中断,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 

答案 1 :(得分:4)

这不安全 - 堆栈的一部分可能用于上下文切换,中断以及您的线程很少或根本不知道或无法控制的其他内容。

答案 2 :(得分:1)

排序。只要你不调用另一个函数,或者(在Unix上)有一个信号被调用它是安全的。但是,它很容易打破,所以我不会这样做。可以先从esp中减去,然后再使用那个空格。

必须担心中断或上下文切换;那些发生在内核堆栈上。如果你可以通过更改堆栈来搞砸这些内容,那么崩溃内核将是微不足道的。