x86 中没有段的直接寻址?

Direct addressing without segment in x86?

内存操作数与 SIB 字节的编码允许 ›none 寄存器‹ 用于索引和基数。所以这应该是一个有效的指令:

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

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

在 16 位和 32 位操作模式下,一个 SIB 字节表示没有基数和索引(即 04 +r 25)只是编码一个 32 位地址,就像 modr/m 字节 05 +r 确实如此。这不影响分段,ds两种情况都是用来增加段基地址的。

在长模式(64 位模式)中,modr/m 字节 05 +r 表示 rip(resp. 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]