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。
评论