【问题标题】:"CMPL" -> Based mode into indirect addressing mode“CMPL” -> 基于模式进入间接寻址模式
【发布时间】:2015-07-26 04:42:05
【问题描述】:

所以我正在处理这个文件。我必须将复杂寻址模式转换为简单寻址模式。

我做到了

movl $0, 0(%esp)

进入

addl $0, %esp
movl $0, (%esp)
addl $-0, %esp

在所有情况下都可以正常工作。

但是我不能做同样的事情

cmpl $4, 28(%esp)

我了解比较与移动不同。 但是有谁知道最后一行的简单版本会是什么样子? 提前谢谢

【问题讨论】:

  • 请注意0(%esp)(%esp) 的含义相同(它们产生完全相同的机器代码序列),因此在这种情况下两个addl 是不必要的。

标签: assembly x86 cmp addressing


【解决方案1】:

这是相同的逻辑:

movl %esp, %eax
addl $28, %eax
cmpl $4, (%eax)

请注意,我使用 eax 作为临时的。您可以移动堆栈指针,但这是个坏主意,而且当您尝试恢复它时它会弄乱标志。无论如何,您都需要一个临时的,例如:

addl $28, %esp
movl (%esp), %eax
addl $-28, %esp
cmpl $4, %eax

您当然可以使用lea,因为它不会修改标志,但显然禁止您使用复杂寻址模式。你也不能使用pushf/popf,因为它们需要堆栈指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多