【问题标题】:ARM Assembly - Are the instructions equivalent?ARM 汇编 - 指令是否相同?
【发布时间】:2015-03-30 22:00:09
【问题描述】:

"stmdb r3!, {sp,lr}" 是否等价于序列?

  1. str sp, [r3, #-4]!
  2. str lr,[r3,#-4]!

“ldmia r0!, {sp,lr}”是否等价于序列?

  1. ldr sp, [r0], #4
  2. ldr lr, [r0], #4

【问题讨论】:

  • 它的工作原理在 arm 文档中指令定义旁边的伪代码中进行了描述。他们很好地解释了它。
  • 这个问题与 ARMv8 有什么关系?

标签: assembly linux-kernel arm


【解决方案1】:

我误解了 stmdb 的功能。 “stmdb r3!, {sp,lr}”的等价物是交换顺序“lr”先跟“sp”:

  • str lr,[r3,#-4]!
  • str sp, [r3, #-4]!

谢谢, 维杰

【讨论】:

  • 事实上它更像sub r3, #8; str lr, [r3]; str sp, [r3, #4](这对于更多的寄存器来说是一种更有效的方法,因为你避免了每个存储之间的回写依赖)。 ARM ARM 描述加载/存储多个操作的方式非常清楚 - 最低编号的寄存器总是从最低地址加载/存储到最低地址,等等 - 只需考虑一下即可映射该地址并适当地调整地址到个别说明。
【解决方案2】:

stmdb r3!, {sp,lr}

str sp, [r3, #-4]!

str lr, [r3, #-4]!

stmdb r3!, {sp,lr} - 在每次传输之前存储多个寄存器和递减地址。 r3 - 基址寄存器和! - 将起始 r3 地址 + 偏移量写回 r3。 DB - 由于 4 堆栈类型(全降序堆栈、全升序堆栈、空降序堆栈、空升序堆栈)。与 STM DB 对应的是 Full Descending 堆栈。所以 sp - 堆栈指针和 lr - 链接寄存器存储到由 r3 和 r3 += sizeof(sp) + sizeof(ls) 寻址的内存中。 r3 += 8;

  1. r3 指向某个内存地址。

  2. r3 -= 8; (4 字节指令)将 r3 移动到较低的内存地址。递减 r3。

  3. 存储顺序 lr-first sp-second。到 r3-8 - 将存储 lr 并将存储到 r3-4 sp。

  4. r3 - 指向结束 (r3+=8);

str sp, [r3, #-4]! (pre-index 变体) - 将 sp 存储到 r3-4 内存地址并保存 r3-=4;

str lr,[r3,#-4]! - 将 lr 存入 (r3-4)-4 并保存 r3-=4;

所以 stmdb r3!, {sp,lr} - 进入更高的地址 lr 位于。 (str sp, [r3, #-4]!) + (str lr, [r3, #-4]!) lr 再次定位到更高的地址。

Introducing ARM assembly language

ldmia r0!, {sp,lr} - 加载多个增量之后。

从 r0 指向的内存中获取值并将其保存到 sp。从内存中获取下一个值并保存到 lr。 r0 += 8;

ldr sp, [r0], #4 - 从内存 r0+4 加载值到 sp。 ([r0], #4) - 后索引变体首先加载和下一次编辑 r0, r0+=4。

ldr lr, [r0], #4 - 从内存 r0+4 加载值到 lr。

从更高内存复制到两个变体值到 lr。

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 2022-08-11
    • 2011-02-18
    • 2023-03-10
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多