我知道在小内存模型中,Segment寄存器保持相同的值。 (%fs,%gs除外)。这里有一个相对主题: Segment prefix when using pointers as function parameters。 但是如果段寄存器具有不同的值呢?例如,我们可以通过指针将地址传递给函数:
mov %fs:(%rax),%rsi
mov %ds:(%rax),%rsi
考虑%fs
和%ds
持有不同的基地址。并且函数可以使用两种引用。功能是否能够区分它们?%rsi
寄存器实际上是什么?或者情况不存在?
答案 0 :(得分:3)
在x64下,ss
,cs
,ds
和es
段都保持相同的值,即0。
fs
和gs
段用于其他目的。
<强>窗强>
fs
指向当前进程的32位线程信息块
gs
指向当前进程的64位TIB。
<强>的Linux 强>
在32位内核中,fs
是每个cpu数据区的基础。在一个
64位内核gs
指向pda(处理器数据区)。 pda是一个
单个结构,而per-cpu数据是per-cpu的一个部分
变量被放入。
fs
。
x86中的寄存器曾经有特殊用途,但现在大多数寄存器都是通用的。
rsi
可用于任何目的
只有字符串说明才有特殊含义
在该上下文中,它用于指向源(例如movsb)。
这个功能能够区分它们吗?
通过在前面添加段前缀。
mov rsi,[rax] // rsi = memory(rax).
xor eax,eax //rax =0 (remember 32 bit instructions zero extend)
mov rsi,[gs:rax] //load the first 8 bytes of the 64-bit TIB into rsi.
关于lea
Lea不访问内存,它只是在不改变标志的情况下进行计算
这些计算通常涉及计算指针,但它也可以是通用算术
在段落前面放置一个段前缀是没有意义的,也没有任何效果。