微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM指令寻址方式之: 内存访问指令寻址

ARM指令寻址方式之: 内存访问指令寻址

时间:08-13 来源:3721RD 点击:

存器后索引寻址

(Register post-indexed)

杂类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两部分;

· !设置指

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top