x86 中没有段的直接寻址?
Direct addressing without segment in x86?
内存操作数与 SIB 字节的编码允许 ›none 寄存器‹ 用于索引和基数。所以这应该是一个有效的指令:
03 04 25 10 32 54 76 – add 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]
内存操作数与 SIB 字节的编码允许 ›none 寄存器‹ 用于索引和基数。所以这应该是一个有效的指令:
03 04 25 10 32 54 76 – add 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]