段前缀mov / lea如何注册?

时间:2017-03-22 03:39:59

标签: assembly x86-64 segment

我知道在小内存模型中,Segment寄存器保持相同的值。 (%fs,%gs除外)。这里有一个相对主题: Segment prefix when using pointers as function parameters。 但是如果段寄存器具有不同的值呢?例如,我们可以通过指针将地址传递给函数:

mov %fs:(%rax),%rsi
mov %ds:(%rax),%rsi

考虑%fs%ds持有不同的基地址。并且函数可以使用两种引用。功能是否能够区分它们?%rsi寄存器实际上是什么?或者情况不存在?

1 个答案:

答案 0 :(得分:3)

在x64下,sscsdses段都保持相同的值,即0。 fsgs段用于其他目的。

<强>窗
fs指向当前进程的32位线程信息块 gs指向当前进程的64位TIB。

<强>的Linux
在32位内核中,fs是每个cpu数据区的基础。在一个 64位内核gs指向pda(处理器数据区)。 pda是一个 单个结构,而per-cpu数据是per-cpu的一个部分 变量被放入。

在64位操作系统(例如WoW64)上运行32位代码时使用

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不访问内存,它只是在不改变标志的情况下进行计算 这些计算通常涉及计算指针,但它也可以是通用算术 在段落前面放置一个段前缀是没有意义的,也没有任何效果。