gpt4 book ai didi

assembly - fs和gs寄存器如何计算有效地址

转载 作者:行者123 更新时间:2023-12-03 06:39:33 30 4
gpt4 key购买 nike

在 x86_64 中,fs 和 gs 寄存器涉及有限形式的分段。就以fs为例,fs如何注册、FSBase MSR共同生成有效地址?

如果我更改 fs 基础而不更改 fs 会发生什么?或者改变 fs 基数会自动改变 fs 吗?

如果我更改 fs 寄存器而不更改 fs 基址,会发生什么情况?有效地址计算受到怎样的影响?

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

mov %fs:(%eax), %ebx

最佳答案

FS 架构寄存器与 FS 基础内部寄存器是分开的。

与往常一样,使用段覆盖只会选择与该段关联的段基址,而不是默认的 DS 基址或 SS 基址(在 64 位模式下固定为 0)。

fs 中的实际值建筑注册本身与它无关。只有当你这样做时它才会发挥作用 mov %fs, %eax实际读取 FS 寄存器本身,而不是使用与其关联的内部基址/限制“寄存器”。

因为有一些方法可以设置内部 FS 基础(例如使用 wrmsr 或在更新的 CPU the wrfsbase instruction 上)比 mov 更有效。至%fs (为了使其从 GDT 或 LDT 加载基址和限制),操作系统通常保留 FS 和 GS 架构寄存器 = 0,即空选择器。

在裸机上,您也可以做到这一点。不必费心创建一个带有您想要的基数的 GDT 条目和 mov将选择器放入 %fs%gs ;直接用 wrmsr 设置底座即可或wrfsbase .

What happens if I change fs register without changing fs base?

据我所知,你不能。 mov %reg/mem, %fs将触发从 GDT 或 LDT 加载内部段基址/限制寄存器(取决于您 mov 的值)。

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

How are the effective address calculations affected?

一如既往。基数+索引*比例+位移。请注意,“有效地址”只是完整地址的偏移部分,不包括段选择器或基址。 What is an effective address?

线性地址的计算方式也与往常相同:segment_base + offset ,其中偏移部分是寻址方式指定的有效地址。

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

关于assembly - fs和gs寄存器如何计算有效地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797987/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com