【发布时间】:2019-01-06 11:01:28
【问题描述】:
我正在阅读Programming from the ground up by Jonathan Bartlett。作者讨论了内存寻址模式,并指出内存地址引用的一般形式是这样的:
ADDRESS_OR_OFFSET (%BASE_OR_OFFSET, %INDEX, MULTIPLIER)
最终地址是这样计算的:
FINAL_ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX.
还指出,如果遗漏了任何部分,则在等式中将其替换为零。 ADDRESS_OR_OFFSET 和MULTIPLIER 需要是常量,而其他元素需要是寄存器。这些似乎是唯一指定的一般规则。
到目前为止,一切都很好。
然后作者讨论了间接寻址方式并举例说明:
movl (%eax), %ebx
将eax 寄存器中存储的地址处的值移动到ebx 寄存器中。
为此,(%eax) 应解释为 0(%eax,0,0),而不是 0(0,%eax,0)。是否有其他规则强制执行这种解释?
【问题讨论】:
-
乘数不能为 0。 1,2,4 或 8
-
@MichaelPetch 嗯..so,那么“如果遗漏任何部分,则在等式中将其替换为 0”的规则并不完全正确。
-
我认为您的书试图建立与实际情况不同的规则。我很确定您的 MOV 将转换为 [%eax(0,0,0)]。英特尔指令参考将是寻找此类规则的更好地方。
-
相关:Referencing the contents of a memory location. (x86 addressing modes) 列出了 x86 支持的寻址模式的所有变体。
标签: assembly x86 att addressing-mode