可以将立即值用作分段选择器

时间:2017-07-27 07:15:57

标签: assembly x86-64 memory-segmentation

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

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

由于段寄存器的数量有限,我可以直接使用数字来代替GDT吗?

喜欢

movq    0x12:Address, %rax

而不是

movq    %gs:Address, %rax

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

第一个问题是:

您希望指令movq 0x12:Address, %rax如何运作?

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

但是64位模式呢?

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

但是,据我所知,手册正确%gs:%fs前缀 NOT 使用64中的%gsFS.base个寄存器位模式,但它们使用特殊寄存器GS.base%fs

忽略%gs%ds寄存器的内容,就像在“常规”操作中忽略movq %fs:Address, %rax寄存器的内容一样。

如果你的问题是:

“如果%fs包含值0x12,那么哪条指令的行为方式与movq %fs:Address, %rax的行为方式相同?”

答案很简单:%fs

...因为该指令根本没有使用movq %fs:Address, %rax寄存器!

如果你的问题是:

“如果FS.base包含值MyFsBase,那么哪条指令的行为方式与movq (Address+MyFsBase), %rax的行为方式相同?”

答案很简单:%fs:Address

...因为(Address+FS.base)实际上意味着:WEB-INF/test.jsp