" stmdb r3!,{sp,lr}"相当于序列?
和
" ldmia r0!,{sp,lr}"相当于序列?
答案 0 :(得分:0)
我误解了stmdb的功能。 “stmdb r3!,{sp,lr}”的等价物将是交换顺序“lr”,首先是“sp”:
谢谢, 维杰
答案 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;
r3指向某个内存地址。
r3 - = 8; (4字节指令)将r3移动到较低的存储器地址。减少r3。
存储订单lr-first sp-second。进入r3-8 - lr将被存储并进入r3-4 sp将被存储。
r3 - 指向结束(r3 + = 8);
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。