【问题标题】:difference between ldmia.w sp, {r1, r2} and ldmia.w sp!, {r1, r2}?ldmia.w sp, {r1, r2} 和 ldmia.w sp!, {r1, r2} 的区别?
【发布时间】:2021-08-26 07:24:36
【问题描述】:

我正在从事一个二进制分析项目,我遇到了两种不同的 ldmia arm 汇编指令变体。

ldmia.w sp, {r1, r2}

ldmia.w sp!, {r1, r2}

我知道 ldmia.w sp!, {r1, r2} 是 pop {r1,r2} 的同义词。 但是 ldmia.w sp, {r1, r2} 呢? .我是使用存储在 sp 中的值作为内存地址来加载到 r1 和 r2 中,这对我来说没有多大意义,还是我在没有更新 sp 的值的情况下从堆栈中弹出,这也没有意义。

【问题讨论】:

    标签: assembly arm stack-memory addressing-mode


    【解决方案1】:

    有关 ARM 汇编语言各部分的含义,请参阅《ARM 体系结构参考手册》。 ! 符号表示新地址被写回寄存器。 IE。 ldmia.w sp!, {r1, r2} 将 8 添加到 spldmia.w sp, {r1, r2} 保持 sp 不变。

    【讨论】:

    • @hanyerfan 这些指令中的每一个都可以用于多种目的。您将无法为每条指令唯一地分配用法。
    • @fuz adds 4 - 两个 32 位寄存器被 ldmia.w sp!, {r1, r2} 读取,所以它加了 8,不是吗?
    • @tum_ 确实如此。
    • @hanyerfan 当然是的。为什么不应该呢?
    • @hanyerfan 从堆栈中弹出一个寄存器是一个加载操作。它不会修改内存。但是,寄存器的内存位置现在位于堆栈指针下方,因此可以随时被中断处理程序或类似处理程序覆盖。
    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多