立即值可以用作段选择器吗

Can immediate values be used as segement selectors

这个问题的背景是我在 Intel 处理器上使用 64 位地址 space。

我知道在X64 中只有gs 和fs 段寄存器可用。所有其他段基数都设置为 0。

由于段寄存器的个数有限,是否可以直接用一个数字索引到GDT中呢?

喜欢

movq    0x12:Address, %rax

而不是

movq    %gs:Address, %rax

不,那不可能。您必须先将段选择器加载到段寄存器中,然后才能在内存操作数中使用它。此外,当然 csdsesss 中的所有六个仍然可用,除了 fs 之外的段偏移量和限制不可用gs 使用特殊机制。

第一个问题是:

您如何看待指令 movq 0x12:Address, %rax 的工作原理?

在 32 位保护模式下,预期的行为很明确:如果存在这样的指令,它的工作方式应该与 movl %fs:Address, %eax%fs0x12 时的行为相同。

但是 64 位模式呢?

我的信息来自旧的 AMD CPU 手册,因此最新的 CPU 可能不正确。

但是据我所知,手册正确地使用 %fs:%gs: 前缀 NOT 使用 %fs%gs 在 64 位模式下注册,但它们使用特殊寄存器 FS.baseGS.base.

%fs%gs 寄存器的内容被忽略的方式与 %ds 寄存器的内容在 "regular" 操作中被忽略的方式相同。

如果您的问题是:

"Which instruction behaves the same way movq %fs:Address, %rax would behave if %fs contained a value of 0x12?"

答案很简单:movq %fs:Address, %rax.

...因为%fs寄存器根本没有被这条指令使用!

如果您的问题是:

"Which instruction behaves the same way movq %fs:Address, %rax would behave if FS.base contained a value of MyFsBase?"

答案也很简单:movq (Address+MyFsBase), %rax

...因为%fs:Address实际上意味着:(Address+FS.base).