如何使用fs和gs寄存器计算有效地址

问题描述 投票:0回答:1

在x86_64中,fs和gs寄存器只涉及有限的分段形式。仅以fs为例,fss如何注册FSBase MSR一起生成有效地址?

如果不更改fs而更改fs基数会怎样?还是更改fs基本会自动更改fs?

如果我更改fs寄存器而不更改fs基数会怎样?有效地址计算如何受到影响?

我们可以举一个简单的例子

mov %fs:(%eax), %ebx
assembly x86-64 cpu-registers addressing-mode memory-segmentation
1个回答
0
投票

FS体系结构寄存器与基于FS的内部寄存器是分开的。

和往常一样,使用段替代仅选择与该段关联的段基础,而不是默认的DS基或SS基(在64位模式下固定为0。]]

fs体系结构寄存器本身的实际值与它无关

。仅当您要mov %fs, %eax实际读取FS寄存器本身,而不使用与其关联的内部基数/限制“寄存器”时,它才起作用。

因为有多种方法可以设置内部FS基础(例如,使用wrmsr或在较新的CPU the wrfsbase instruction上),其效率要比wrfsbasemov更高(以使其可以从GDT或LDT),操作系统通常会离开FS和GS体系结构寄存器= 0,为空选择器。

在裸机上,您也可以这样做。不要为创建一个带有所需基数的GDT条目而烦恼,并且%fs将选择器插入mov%fs;只需直接用%gswrmsr设置基数即可。

如果我更改fs寄存器而不更改fs基数会怎样?

不能,AFAIK。 wrfsbase将触发从GDT或LDT加载内部段基数/限制寄存器(取决于您移动的值)。

[请注意,有些人将这些内部事物称为“缓存”,但它们不是缓存。它们保证在您加载值时不会保留这些值,因此,如果您更改GDT条目而不用该选择器重新加载段寄存器,它们也将永远不会发生变化。

有效的地址计算如何受到影响?

一如既往。基数+索引*比例+位移。请注意,“有效地址”只是完整地址的偏移部分,不包括段选择器或基址。 mov %reg/mem, %fs

线性

地址的计算也与往常一样:What is an effective address?,其中偏移量部分是编址模式指定的有效地址。

寻址模式默认为使用DS段基址,除非寻址模式中的“基址寄存器”为E / RBP或E / RSP,在这种情况下为SS基址。但是前缀字节可以覆盖默认值。这就是segment_base + offset告诉汇编器发出的内容。

© www.soinside.com 2019 - 2024. All rights reserved.