x86中没有段的直接寻址?

Posted

技术标签:

【中文标题】x86中没有段的直接寻址?【英文标题】:Direct addressing without segment in x86? 【发布时间】:2017-08-30 10:50:46 【问题描述】:

使用 SIB 字节对内存操作数进行编码允许对索引和基址使用 ›none register‹。所以这应该是一个有效的指令:

03 04 25 10 32 54 76add eax, dword [ 0x76543210 ]

地址应该这样计算:1·0+0+0x76543210,并且不基于任何段寄存器。 在平面内存中,这不应该改变任何东西,但如果ds 不为零,这与add eax, dword ds:0x76543210 有什么不同?

【问题讨论】:

ds 是隐式段,和打出来一样。 【参考方案1】:

在 16 位和 32 位操作模式中,指示无基数和无索引的 SIB 字节(即04 +r 25)只是对 32 位地址进行编码,就像 modr/m 字节 05 +r 所做的那样。这不影响分段,ds 用于在两种情况下添加分段基地址。

在长模式(64 位模式)中,modr/m 字节05 +r 表示rip(分别为eip)相对地址,而04 +r 25 表示绝对地址。例如:

8b 05 XX XX XX XX       is mov eax, [rip+XXXXXXXX]
8b 04 25 XX XX XX XX    is mov eax, [XXXXXXXX]

【讨论】:

以上是关于x86中没有段的直接寻址?的主要内容,如果未能解决你的问题,请参考以下文章

x86汇编语言

80x86的指令都有哪些寻址方式

x86汇编如何查看一个地址的值

指令系统中采用不同寻址方式的主要目的是啥?

存储器 间接 寻址 试验 立即寻址 ;直接寻址 ;间接寻址 16位指针间接寻址 32位指针间接寻址

Intel X86 CPU寻址方式