首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释%gs:0x14?

如何解释%gs:0x14?
EN

Stack Overflow用户
提问于 2013-12-21 10:16:57
回答 2查看 2.9K关注 0票数 2

我对在x86程序集中使用冒号感到有点困惑。我知道,在实模式下,%gs:0x14将是%gs移位4位的地址,并与0x14一起添加。但在保护模式下是一样的吗?例如,在保护模式下,

代码语言:javascript
复制
movl %gs:0x14 %eax 

以何种方式访问%gs:0x14?它类似于0x14(%gs),还是与实模式相同?

更新:为了使我的问题更清楚,假设%gs = 0x1234在指令movl %gs:0x14 %eax之后%eax的值是多少。

更多信息:

刚刚发现本文档对于gs和fs在不同系统http://www.akkadia.org/drepper/tls.pdf中的功能很有用。

此链接提供有关段:偏移地址的信息。

http://thestarman.pcministry.com/asm/debug/Segments.html

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-21 14:12:44

首先,让我们来处理这些条款。在一般情况下,您使用的是“保护模式”,而不是真实模式。但是,至少在英特尔手册中,这个术语只适用于32位模式。对于64位模式,他们使用了一个糟糕的营销术语"IA-32e模式“,这与AMD的”长模式“相比是可怕的,但两者仍然隐藏着64位模式也受到保护的事实。

这种差异很重要,因为对于32位和64位保护模式,处理%gs是不同的.对于32位,它是另一个段寄存器。线程切换代码在同一虚拟空间中为当前线程填充一个段基,因此,与{CS、DS、ES、SS}不同,在平坦模式下它的基数不是零。对于64位,它只是一个保存在处理器MSR中的偏移量,也被调度程序更改为当前的线程TLS地址。(Linux/*BSD/Windows/等中使用的%fs和%gs中的哪一个用于什么角色的细节可能有所不同。)但是,作为一个常见的结果,当看到像%gs:0x14这样的访问时,您应该意识到

  • 获得GS基地址(如上面所解释的,使用32位的通用方法和64位环境下的特殊MSR处理)。
  • 0x14添加到此地址。

这就是你所需要知道的,除非你开发内核或其他深入的系统,比如葡萄酒。

票数 1
EN

Stack Overflow用户

发布于 2013-12-21 11:38:36

您需要仔细阅读体系结构的应用程序二进制接口规范(可能是x86-64),即X86-64 ABI

您将发现%gs与线程本地存储有关。见这个答案

因此,您的机器指令可能正在加载当前TLS的偏移量0x14处的单词。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20717890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档