假设我想让堆栈指针稍后在C代码中使用它,并且出于某种原因想在汇编中执行此操作,如此(x86,32位):
asm("\t movl %%esp,%0" : "=r"(my_p))
my_p
会真正指向堆栈还是我还应该考虑ss
?
答案 0 :(得分:0)
32位和64位x86现代版本的Windows,Linux和macOS将SS
寄存器初始化为固定值,之后永远不会更改它。所以你不必捕获SS
。您可以参考this文章,详细了解过去如何使用x86细分以及当前如何使用它。
但是,在实模式或保护模式下(没有分页),SS
可能会发生变化,尤其是在从一个线程或任务切换到另一个线程或任务时。如果程序以其中一种模式运行,那么您也应该捕获SS
。请注意,SS
可以使用LSS
,MOV
或POP
进行更改。这些指令可以在任何权限级别执行。