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;
r3 指向某个内存地址。
r3 -= 8; (4 字节指令)将 r3 移动到较低的内存地址。递减 r3。
存储顺序 lr-first sp-second。到 r3-8 - 将存储 lr 并将存储到 r3-4 sp。
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。