ARM LOAR-STORE指令
变址模式 | 数据 | 基址寄存器 | 示例 |
回写前变址 | mem[base+offset] | 基址寄存器加上偏移 | LDR r0,[r1,#4]! |
前变址 | mem[base+offset] | 不变 | LDR r0,[r1,#4] |
后变址 | mem[base] | 基址寄存器加上偏移 | LDR r0,[r1],#4 |
PRE
r0=0x00000000 r1=0x00009000 mem32[0x00009000]=0x01010101 mem32[0x00009004]=0x02020202
回写前变址:
LDR r0,[r1,#4]!
POST(1)
r0=0x02020202 r1=0x00009004
前变址:
LDR r0,[r1,#4]
POST(2)
r0=0x02020202 r1=0x00009000
后变址:
LDR r0,[r1],#4
POST(3)
r0=0x01010101 r1=0x00009004
寻址模式 | 指令 | r0= | r1+= |
回写前变址 |
LDR r0,[r1,#4]! LDR r0,[r1,r2]! LDR r0,[r1,r2,LSR#4]! |
mem32[r1+0x4] mem32[r1+r2] mem32[r1+(r2 LSR 0x4)] |
0x4 r2 (r2 LSR 0x4) |
前变址 |
LDR r0,[r1,#4] LDR r0,[r1,r2] LDR r0,[r1,-r2,LSR#4] |
mem32[r1+0x4] mem32[r1+r2] mem32[r1-(r2 LSR 0x4)] |
0 0 0 |
后变址 |
LDR r0,[r1],#4 LDR r0,[r1],r2 LDR r0,[r1],r2,LSR#4 |
mem32[r1] mem32[r1] mem32[r1] |
0x4 r2 (r2 LSR 0x4) |
多寄存器:
<LDM|STM>{<cond>}<寻址模式>Rn{!},<Registers>{r^}
寻址模式 | 描述 | 起始地址 | 结束地址 | Rn! |
IA | 执行后增加 | Rn | Rn+4*N-4 | Rn+4*N |
IB | 执行前增加 | Rn+4 | Rn+4*N | Rn+4*N |
DA | 执行后减少 | Rn-4*N+4 | Rn | Rn-4*N |
DB | 执行前减少 | Rn-4*N | Rn-4 | Rn-4*N |
r0=0x00080010 LDMIA=r0!,{r1-r3} 0x00080020 0x00000000b ---->0x0008001C 0x00000000a 0x00080008 0x000000009---->r3 0x00080004 0x000000008---->r2 r0 ---->0x00080010 0x000000007---->r1 0x0008000C 0x000000006 LDMIB=r0!,{r1-r3} 0x00080020 0x00000000b ---->0x0008001C 0x00000000a---->r3 0x00080008 0x000000009---->r2 0x00080004 0x000000008---->r1 r0 ---->0x00080010 0x000000007 0x0008000C 0x000000006 LDMDA=r0!,{r1-r3} 0x00080020 0x000000005 ---->0x0008001C 0x000000004---->r3 0x00080008 0x000000003---->r2 0x00080004 0x000000002---->r1 r0 ---->0x00080010 0x000000001 0x0008000C 0x000000000