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

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

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

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]形式

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

网站地图

Top