这个问题的背景是我在Intel处理器上使用64位地址空间。
我知道在X64中只有gs和fs段寄存器可用。所有其他段基数都设置为0.
由于段寄存器的数量有限,我可以直接使用数字来代替GDT吗?
喜欢
movq 0x12:Address, %rax
而不是
movq %gs:Address, %rax
答案 0 :(得分:2)
不,那是不可能的。您必须先将段选择器加载到段寄存器中,然后才能在内存操作数中使用它。此外,当然cs
,ds
,es
和ss
中的所有六个仍然可用,除了fs
之外,不包括段偏移和限制和gs
使用特殊机制。
答案 1 :(得分:1)
第一个问题是:
您希望指令movq 0x12:Address, %rax
如何运作?
在32位保护模式下,预期的行为是明确的:如果存在这样的指令,它应该与movl %fs:Address, %eax
%fs
0x12
时%fs:
行为相同。
但是64位模式呢?
我的信息来自较旧的AMD CPU手册,因此最新的CPU可能不适用。
但是,据我所知,手册正确%gs:
和%fs
前缀 NOT 使用64中的%gs
和FS.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
。