有人告诉我,如果我使用rsp
作为通用寄存器,操作系统可能会将寄存器转储到中断的位置,从而导致出现问题。
这是真的,如果不是,因此,如果我不需要堆栈,我可以使用rsp
作为通用寄存器吗?
编辑:在用户空间中运行。
答案 0 :(得分:3)
如果发生中断,你不是搞砸了吗?
那些在DOS下编程的人可能正在为此蠕动 指出中断的可能性。通常,重用 像这样的堆栈指针是一个非常糟糕的主意,因为你不知道 当一个中断可能发生时,当一个中断时,CPU尽职尽责 将当前程序计数器和标志推送到堆栈。如果你 已经重用ESP,这将导致随机数据结构 丢弃。在这种环境中,ESP必须始终指向有效 和足够的堆栈空间来服务中断,无论何时 如果不成立,则必须禁用中断。运行中断 长时间禁用会降低系统响应能力(丢失中断) 并且延迟很差,并且对于一个大的例行程序来说是不实际的。
但是,我们在此处以受保护模式运行。
在Win32中的用户空间中运行时,中断不会推送到 用户堆栈,但改为内核堆栈。如果你考虑一下,它 不能使用用户堆栈。如果线程出来了 当CPU尝试时,堆栈空间,甚至只是有一个无效的堆栈 推送EIP和EFLAGS,它会出现页面错误,并且您无法查看页面错误 在中断处理程序中。因此,调度程序可以执行任意数量的调度 正在运行无堆栈例程的上下文切换,以及任何数据 被指向ESP的结构不会受到影响。
答案 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进行函数调用,而不会指向堆栈。