段选择器和普通指针

时间:2014-09-16 13:38:22

标签: assembly x86 cpu-architecture

假设我想让堆栈指针稍后在C代码中使用它,并且出于某种原因想在汇编中执行此操作,如此(x86,32位):

asm("\t movl %%esp,%0" : "=r"(my_p))

my_p会真正指向堆栈还是我还应该考虑ss

1 个答案:

答案 0 :(得分:0)

32位和64位x86现代版本的Windows,Linux和macOS将SS寄存器初始化为固定值,之后永远不会更改它。所以你不必捕获SS。您可以参考this文章,详细了解过去如何使用x86细分以及当前如何使用它。

但是,在实模式或保护模式下(没有分页),SS可能会发生变化,尤其是在从一个线程或任务切换到另一个线程或任务时。如果程序以其中一种模式运行,那么您也应该捕获SS。请注意,SS可以使用LSSMOVPOP进行更改。这些指令可以在任何权限级别执行。