立即值可以用作段选择器吗
Can immediate values be used as segement selectors
这个问题的背景是我在 Intel 处理器上使用 64 位地址 space。
我知道在X64 中只有gs 和fs 段寄存器可用。所有其他段基数都设置为 0。
由于段寄存器的个数有限,是否可以直接用一个数字索引到GDT中呢?
喜欢
movq 0x12:Address, %rax
而不是
movq %gs:Address, %rax
不,那不可能。您必须先将段选择器加载到段寄存器中,然后才能在内存操作数中使用它。此外,当然 cs
、ds
、es
和 ss
中的所有六个仍然可用,除了 fs
之外的段偏移量和限制不可用gs
使用特殊机制。
第一个问题是:
您如何看待指令 movq 0x12:Address, %rax
的工作原理?
在 32 位保护模式下,预期的行为很明确:如果存在这样的指令,它的工作方式应该与 movl %fs:Address, %eax
在 %fs
为 0x12
时的行为相同。
但是 64 位模式呢?
我的信息来自旧的 AMD CPU 手册,因此最新的 CPU 可能不正确。
但是据我所知,手册正确地使用 %fs:
和 %gs:
前缀 NOT 使用 %fs
和 %gs
在 64 位模式下注册,但它们使用特殊寄存器 FS.base
和 GS.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)
.
这个问题的背景是我在 Intel 处理器上使用 64 位地址 space。
我知道在X64 中只有gs 和fs 段寄存器可用。所有其他段基数都设置为 0。
由于段寄存器的个数有限,是否可以直接用一个数字索引到GDT中呢?
喜欢
movq 0x12:Address, %rax
而不是
movq %gs:Address, %rax
不,那不可能。您必须先将段选择器加载到段寄存器中,然后才能在内存操作数中使用它。此外,当然 cs
、ds
、es
和 ss
中的所有六个仍然可用,除了 fs
之外的段偏移量和限制不可用gs
使用特殊机制。
第一个问题是:
您如何看待指令 movq 0x12:Address, %rax
的工作原理?
在 32 位保护模式下,预期的行为很明确:如果存在这样的指令,它的工作方式应该与 movl %fs:Address, %eax
在 %fs
为 0x12
时的行为相同。
但是 64 位模式呢?
我的信息来自旧的 AMD CPU 手册,因此最新的 CPU 可能不正确。
但是据我所知,手册正确地使用 %fs:
和 %gs:
前缀 NOT 使用 %fs
和 %gs
在 64 位模式下注册,但它们使用特殊寄存器 FS.base
和 GS.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)
.