【问题标题】:Direct addressing without segment in x86?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 是隐式段,和打出来一样。

标签: assembly x86 addressing-mode


【解决方案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]

【讨论】:

    猜你喜欢
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2012-05-11
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多