| 格 式 | 模 式 |
1 | [Rn,#±<offset_12>] | 立即数偏移寻址 (Immediate offset) |
2 | [Rn,±Rm] | 寄存器偏移寻址 (Register offset) |
3 | [Rn,Rm,<shift>#< offset_12>] | 带移位的寄存器偏移寻址 (Scaled register offset) |
4 | [Rn,#±< offset_12>]! | 立即数前索引寻址 (Immediate pre-indexed) |
5 | [Rn,±Rm]! | 寄存器前索引寻址 (Register post-indexed) |
6 | [Rn,Rm,<shift>#< offset_12>]! | 带移位的寄存器前索引寻址 (Scaled register pre-indexed) |
7 | [Rn],#±< offset_12> | 立即数后索引寻址 (Immediate post-indeded) |
8 | [Rn],±<Rm> | 寄存器后索引寻址 (Register post-indexed) |
9 | [Rn],±<Rm>,<shift>#< offset_12> | 带移位的寄存器后索引寻址 (Scaled register post-indexed) |
位 标 识 | 取 值 | 含 义 |
P | P=0 | 使用后索引寻址 |
P=1 | 使用偏移地址或前索引寻址(由W位决定) | |
U | U=0 | 访问的地址=基址寄存器的值-偏移量(offset) |
U=1 | 访问的地址=基址寄存器的值+偏移量(offset) | |
B | B=0 | 字访问Load/Store |
B=1 | 无符号字节访问Load/Store | |
W | W=0 | 如果P=0,该指令为LDR、LDRB、STR或STRB指令,且内存访问指令为正常访问指令;如果P=1,指令执行不更新基地址 |
W=1 | 如果P=0,该指令为LDRBT、LDRT、STRBT或STRT,且指令为非特权(用户模式)访问指令;如果P=1,计算内存地址并更新基地址 | |
L | L=0 | Store指令 |
L=1 | Load指令 |
| 格 式 | 模 式 |
1 | [Rn,#±<offset_8>] | 立即数偏移寻址 (Immediate offset) |
2 | [Rn,±Rm] | 寄存器偏移寻址 (Register offset) |
3 | [Rn,#±< offset_8>]! | 立即数前索引寻址 (Immediate pre-indexed) |
4 | [Rn,±Rm]! | 寄存器前索引寻址 (Register post-indexed) |
5 | [Rn],#±< offset_8> | 立即数后索引寻址 (Immediate post-indeded) |
6 | [Rn],±<Rm> | 寄存器后索引寻址 (Register post-indexed) |
位 标 识 | 取 值 | 含 义 |
P | P=0 | 使用后索引寻址 |
P=1 | 使用偏移地址或前索引寻址(由W位决定) |
位 标 识 | 取 值 | 含 义 |
U | U=0 | 访问的地址=基址寄存器的值-偏移量(offset) |
U=1 | 访问的地址=基址寄存器的值+偏移量(offset) | |
W | W=0 | 如果P=0,使用后索引寻址;P=1,指令不改变基址寄存器的值 |
W=1 | 如果P=0,未定义指令;如果P=1,将计算的内存访问地址回写到基址寄存器 | |
L | L=0 | Store指令 |
L=1 | Load指令 | |
S | S=0 | 无符号半字内存访问 |
S=1 | 有符号半字内存访问 | |
H | H=0 | 字节访问 |
H=1 | 半字访问 |
| 注意 | 当S=0并且H=0时,并非无符号的字节内存访问指令。无符号的内存访问指令不使用该种寻址方式,详见本章上一节。 当S=1并且L=0时,并非是有符号的存储指令,而是未定义指令。ARM指令并未区分有符号和无符号的字节和半字存储。 |
| 格 式 | 模 式 |
1 | IA(Increment After) | 后递增方式 |
2 | IB(Increment Before) | 先递增方式 |
3 | DA(Decrement After) | 后递减方式 |
4 | DB(Decrement Before) | 先递减方式 |
位标识 | 取 值 | 含 义 |
P | P=0 | Rn包含的地址,是所要访问的内存块的高地址(U=0)还是低地址(U=1) |
P=1 | 标识Rn所指向的内存单元是否被访问 | |
U | U=0 | Rn所指内存单元为所要访问的内存单元块的高地址 |
U=1 | Rn所指内存单元为所要访问的内存单元块的低地址 | |
S | S=0 | 当程序计数器PC作为要加载的寄存器之一时,S标识是否将spsr内容拷贝到cpsr;对于不加载PC的load指令和所有store指令,S标识特权模式下,使用用户模式寄存器组代替当前模式下寄存器组 |
S=1 | ||
W | W=0 | 数据传送完毕,更新地址寄存器内容 |
W=1 | ||
L | L=0 | Store指令 |
L=1 | Load指令 |
| 注意 | 如果程序中有对协处理器数据的进栈/出栈操作,最好使用FD或EA类型堆栈。这样可以使用一条STC或LDC指令将数据进栈或出栈。 |
批量数据寻址方式 | 堆栈寻址方式 | L位 | P位 | U位 |
LDMDA | LDMFA | 1 | 0 | 0 |
LDMIA | LDMFD | 1 | 0 | 1 |
LDMDB | LDMEA | 1 | 1 | 0 |
LDMIB | LDMED | 1 | 1 | 1 |
STMDA | STMED | 0 | 0 | 0 |
STMIA | STMEA | 0 | 0 | 1 |
STMDB | STMFD | 0 | 1 | 0 |
STMIB | STMFA | 0 | 1 | 1 |
| 格 式 | 说 明 |
1 | [<Rn>,#±<offset_8>*4] | 立即数偏移寻址 |
2 | [<Rn>,#±<offset_8>*4]! | 前索引立即数偏移寻址 |
3 | [<Rn>],#±<offset_8>*4 | 后索引立即数偏移寻址 |
4 | [<Rn>], <option> | 直接寻址 |
位 标 识 | 取 值 | 含 义 |
P | P=0 | 标识使用偏移寻址还是前索引寻址(由W位决定) |
P=1 | 标识使用后索引寻址还是直接寻址(由W位决定) | |
U | U=0 | 从基地址中减去偏移量offset |
U=1 | 从基地址中加上偏移量offset | |
N | N=0 | 和具体使用的协处理器相关 |
N=1 | ||
W | W=0 | 指令执行结束,不改变基址寄存器的值 |
W=1 | 访问的内存地址回写到基址寄存器 | |
L | L=0 | Store指令 |
L=1 | Load指令 |
| 注意 | 这种寻址方式最多允许传输16的字。 |
| 注意 | 这种寻址方式最多允许传输16的字。 |
| 注意 | 这种寻址方式最多允许传输16的字。 |
欢迎光临 DIY编程器网 (http://diybcq.com/) | Powered by Discuz! X3.2 |