ARM程序集 - 指令是否等效?

时间:2015-03-30 22:00:09

标签: assembly linux-kernel arm

" stmdb r3!,{sp,lr}"相当于序列?

  1. str sp,[r3,#-4]!
  2. str lr,[r3,#-4]!
  3. " ldmia r0!,{sp,lr}"相当于序列?

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

2 个答案:

答案 0 :(得分:0)

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

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

谢谢, 维杰

答案 1 :(得分:0)

stmdb r3!,{sp,lr}

str sp,[r3,#-4]!

str lr,[r3,#-4]!

stmdb r3!,{sp,lr} - 在每次传输之前存储多个寄存器和递减地址。 r3 - 基址寄存器和! - 将r3地址+ offcet写入r3返回。 DB - 由于4堆栈类型(完全降序堆栈,完全升序堆栈,空降序堆栈,空升序堆栈)。 STM DB对应于完全降序堆栈。因此sp-stack指针和lr-link寄存器存储到由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);

  5. str sp,[r3,#-4]! (预索引变量) - 将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。