我对在x86程序集中使用冒号感到有点困惑。我知道,在实模式下,%gs:0x14将是%gs移位4位的地址,并与0x14一起添加。但在保护模式下是一样的吗?例如,在保护模式下,
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
发布于 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这样的访问时,您应该意识到
这就是你所需要知道的,除非你开发内核或其他深入的系统,比如葡萄酒。
发布于 2013-12-21 11:38:36
您需要仔细阅读体系结构的应用程序二进制接口规范(可能是x86-64),即X86-64 ABI。
您将发现%gs与线程本地存储有关。见这个答案。
因此,您的机器指令可能正在加载当前TLS的偏移量0x14处的单词。
https://stackoverflow.com/questions/20717890
复制相似问题