ARM指令寻址方式之: 内存访问指令寻址
杂类Load/Store指令的解码格式如图4.23所示。
图4.23 杂类Load/Store指令解码格式
编码格式中各标志位的含义如表4.5所示。
表4.5 杂类Load/Store指令编码格式各标志位含义
位 标 识 | 取 值 | 含 义 |
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.[Rn,#±<offset_8>]
(1)编码格式
指令的编码格式如图4.24所示。
图4.24 杂项内存访问指令--立即数偏移寻址编码格式
内存访问地址为基址寄存器Rn的值加(或减)立即数offset_8。
编程中,在访问结构体或记录(record)类型的变量时,这些内存的操作指令是十分有效的。另外,在子程序中,也常用这些指令访问本地变量和堆栈。当offset_8=0时,内存访问地址即基址寄存器Rn的值。
(2)语法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,#±<offset_12>]
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址。
· <offset_8>为8位立即数,内存访问地址偏移量。
(3)操作伪代码
offset_8 = (immedH << 4) OR immedL
If U = = 1 then
Address = Rn + offset_8
Else
Address = Rn – offset_8
(4)说明
① 如果指令中没有指定立即数,使用[<Rn>],编译器按[<Rn>,#0]形式编码。
② 如果Rn被指定为程序计数器r15,其值为当前指令地址加8。
2.[Rn,±Rm]
(1)编码格式
指令的编码格式如图4.25所示。
图4.25 杂项内存访问指令--寄存器偏移寻址编码格式
内存访问地址为基址寄存器Rn的值加(或减)偏移寄存器Rm的值。
该寻址方式适合使用指针访问数组中的单个数据成员。
(2)语法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<Rm>]
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· <Rm>为偏移地址寄存器,包含内存访问地址偏移量。
(3)操作伪代码
If U = = 1 then
Address = Rn + Rm
Else
Address = Rn – Rm
(4)说明
如果Rn被指定为程序计数器r15,其值为当前指令地址加8;如果r15被用作偏移地址寄存器Rm的值,指令的执行结果不可预知。
3.[Rn,#±< offset_8>]!
(1)编码格式
指令的编码格式如图4.26所示。
图4.26 杂类内存访问指令--前索引立即数偏移寻址编码格式
内存地址为基址寄存器Rn加/减立即数offset_8的值。当指令执行的条件<cc>满足时,生成的地址写回基址寄存器Rn中。
该寻址方式适合访问数组自动进行数组下标的更新。
(2)语法格式
LDR|STR{<cond>}H|SH|SB|D <Rd>,[<Rn>,±<offset_8>] !
其中:
· Rn为基址寄存器,该寄存器包含内存访问的基地址;
· <offset_8>为8位立即数,内存访问地址偏移量,在指令编码格式中被拆为immedH和immedL两部分;
· !设置指
- ARM指令寻址方式之: 数据处理指令的寻址方式(08-13)
- ARM汇编指令ARM寻址方式、汇编指令、伪指令(11-20)
- 单片机的指令和寻址方式(11-13)
- ARM 指令的寻址方式(11-11)
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)