我可以使用rsp作为通用寄存器

时间:2014-03-05 22:58:34

标签: assembly x86 x86-64

有人告诉我,如果我使用rsp作为通用寄存器,操作系统可能会将寄存器转储到中断的位置,从而导致出现问题。

这是真的,如果不是,因此,如果我不需要堆栈,我可以使用rsp作为通用寄存器吗?

编辑:在用户空间中运行。

2 个答案:

答案 0 :(得分:3)

  

如果发生中断,你不是搞砸了吗?

     

那些在DOS下编程的人可能正在为此蠕动   指出中断的可能性。通常,重用   像这样的堆栈指针是一个非常糟糕的主意,因为你不知道   当一个中断可能发生时,当一个中断时,CPU尽职尽责   将当前程序计数器和标志推送到堆栈。如果你   已经重用ESP,这将导致随机数据结构   丢弃。在这种环境中,ESP必须始终指向有效   和足够的堆栈空间来服务中断,无论何时   如果不成立,则必须禁用中断。运行中断   长时间禁用会降低系统响应能力(丢失中断)   并且延迟很差,并且对于一个大的例行程序来说是不实际的。

     

但是,我们在此处以受保护模式运行。

     

在Win32中的用户空间中运行时,中断不会推送到   用户堆栈,但改为内核堆栈。如果你考虑一下,它   不能使用用户堆栈。如果线程出来了   当CPU尝试时,堆栈空间,甚至只是有一个无效的堆栈   推送EIP和EFLAGS,它会出现页面错误,并且您无法查看页面错误   在中断处理程序中。因此,调度程序可以执行任意数量的调度   正在运行无堆栈例程的上下文切换,以及任何数据   被指向ESP的结构不会受到影响。

来自http://www.virtualdub.org/blog/pivot/entry.php?id=85

答案 1 :(得分:0)

是的,您可以在非常受控的情况下使用,但实际上只使用SSE2和/或MMX。


相关:Is it valid to write below ESP?讨论了Windows中可以异步使用32位代码中的堆栈指针的内容。使用无效的堆栈指针,这些东西将崩溃,而不是踩在它下面的空间上。 (或者,如果指向可写内存,则将其用作堆栈空间。)

在GNU / Linux中,信号处理程序可以异步使用用户空间堆栈指针,但是您可以使用sigaltstack / SA_ONSTACK为它们使用备用堆栈。


还要注意,x86-64可以保证SSE2 。如果您已经使用了所有xmm0..15(SSE)和mm0..7(MMX),通常只需考虑将RSP用作第16个通用寄存器。

有时,对于没有MMX的CPU,将ESP用作32位DSP代码中的第8个通用寄存器是很有意义的;因此,可以在virtualdub过滤器的上下文中找到有关它的讨论。

在64位代码中通常是没有意义的,因为您总是拥有16个128位SIMD寄存器(以及在其上使用的SIMD指令),并且是两倍多非堆栈指针整数寄存器。还有8个64位mmx寄存器或8个80位x87寄存器,但是您要使用它们。在大多数调用约定中,大多数这些寄存器都是调用优先的,但是无论如何,您都无法使用RSP进行函数调用,而不会指向堆栈。