ARM指令寻址方式之: 内存访问指令寻址
4.2 内存访问指令寻址
根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种。
① 字及无符号字节的Load/Store指令的寻址方式。
② 杂类Load/Store指令的寻址方式。
③ 批量Load/Store指令的寻址方式。
④ 协处理器Load/Store指令的寻址方式。
4.2.1 字及无符号字节的Load/Store指令的寻址方式
字及无符号字节的Load/Store指令语法格式如下:
LDR|STR{<cond>}{B}{T} <Rd>,<addressing_mode>
其中<addressing_mode>共有9种寻址方式,如表4.2所示。
表4.2 字及无符合字节的Load/Store指令的寻址方式
| 格 式 | 模 式 |
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) |
字及无符号字节的Load/Store指令的解码格式如图4.13所示。
图4.13 字及无符号字节的Load/Store指令的解码格式
编码格式中各位的含义如表4.3所示。
表4.3 字和无符号半字Load/Store指令编码格式各位含义
位 标 识 | 取 值 | 含 义 |
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_12>]
(1)编码格式
指令的编码格式如图4.14所示。
图4.14 内存访问指令--立即数偏移寻址编码格式
内存访问地址为基址寄存器Rn的值加(或减)立即数offset_12。
编程中,在访问结构体或记录(record)类型的变量时,这些内存的操作指令是十分有效的。另外,在子程序中也常用这些指令访问本地变量和堆栈。
(2)语法格式
LDR|STR{<cond>}{B}{T} <Rd>,[<Rn>,#±<offset_12>]
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· <offset_12>为12位立即数,内存访问地址偏移量。
(3)操作伪代码
If U = = 1 then
Address = Rn + offset_12
Else
Address = Rn – offset_12
(4)说明
① 如果指令中没有指定立即数,使用[<Rn>],编译器按[<Rn> ① 如果指令中没有指定立即数,使用[<Rn>],编译器按[<Rn>,#0]形式
- ARM指令寻址方式之: 数据处理指令的寻址方式(08-13)
- ARM汇编指令ARM寻址方式、汇编指令、伪指令(11-20)
- 单片机的指令和寻址方式(11-13)
- ARM 指令的寻址方式(11-11)
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)