ARM
理器
解-扉 出片.pdf 1 2014/5/27 13:55:03
C
M
Y
CM
MY
CY
CMY
K
第
3
章
ARM
微处理器的指令系统
ARM
指令集可以分为跳½指令、
数据处理指令、
程序状态寄存器传输指令、
Load/Store
指令、协处理器指令和异常中断产生指令。根据½用的指令类型不同,指令的寻址方式分
为数据处理指令寻址方式和内存访问指令寻址方式。
本章主要介绍
ARM
汇编语言。主要内容如下:
q
ARM
处理器的寻址方式。
q
ARM
处理器的指令集。
3.1
ARM
处理器的寻址方式
ARM
指令的寻址方式分为数据处理指令寻址方式和内存访问指令寻址方式。
3.1.1
数据处理指令寻址方式
数据处理指令的基本语法格式如下:
<opcode> {<cond>} {S} <Rd>,<Rn>,<shifter_operand>
其中,<shifter_operand>有
11
种½式,如表
3-1
所示。
表
3-1 <shifter_operand>的寻址方式
语
1
2
3
4
5
6
7
8
9
10
11
#<immediate>
<Rm>
<Rm>, LSL #<shift_imm>
<Rm>, LSL <Rs>
<Rm>, LSR
<Rm>, LSR
<Rm>, ASR
<Rm>, ASR
#<shift_imm>
<Rs>
#<shift_imm>
<Rs>
法
立即数寻址
寄存器寻址
立即数逻辑左移
寄存器逻辑左移
立即数逻辑右移
寄存器逻辑右移
立即数算术右移
寄存器算术右移
立即数循环右移
寄存器循环右移
寄存器扩展循环右移
寻 址 方
式
<Rm>, ROR #<shift_imm>
<Rm>, ROR <Rs>
<Rm>, RRX
ARM
处理器开发详解——基于
ARM Cortex-A8
处理器的开发设计(第
2
版)
数据处理指令寻址方式可以分为以下几种。
(1)立即数寻址方式。
(2)寄存器寻址方式。
(3)寄存器移½寻址方式。
1.立即数寻址方式
指令中的立即数是由一个
8bit
的常数移动
4bit
偶数½(0,2,4,…,26,28,30)得
到的。所以,每一条指令½包含一个
8bit
的常数
X
和移½值
Y,得到的立即数 = X
循环右
移(2×Y)
,如图
3-1
所示。
图
3-1
立即数表示方法
下面列举了一些有效的立即数:
0xFF、0x104、0xFF0、0xFF00、0xFF000、0xFF000000、0xF000000F
下面是一些无效的立即数:
0x101、0x102、0xFF1、0xFF04、0xFF003、0xFFFFFFFF、0xF000001F
下面是一些应用立即数的指令:
MOV
ADD
CMP
BIC
R0,#0
R3,R3,#1
R7,#1000
R9,R8,#0xFF00
;送 0
到
R0
;R3
的值加
1
;将 R7
的值和
1000
比较
;将 R8
中
8½15
½清零,结果保存在
R9
中
2.寄存器寻址方式
寄存器的值可以被直接用于数据操½指令,这种寻址方式是各类处理器经常采用的一
种方式,也是一种执行效率较高的寻址方式,如:
MOV R2,R0
ADD R4,R3,R2
CMP R7,R8
;R0
的值送
R2
;R2
加
R3,结果送 R4
;比较 R7
和
R8
的值
3.寄存器移½寻址方式
寄存器的值在被送到
ALU
之前,可以事先经过桶½移½寄存器的处理。预处理和移½
发生在同一周期内,所以有效地½用移½寄存器,可以增加代码的执行效率。
下面是一些在指令中½用了移½操½的例子:
ADD
MOV
RSB
SUB
MOV
R2,R0,R1,LSR #5
R1,R0,LSL #2
R9,R5,R5,LSL #1
R1,R2,R0,LSR #4
R2,R4,ROR R0
52
第
3
章
ARM
微处理器的指令系统
3.1.2
内存访问指令寻址方式
内存访问指令的寻址方式可以分为以下几种:
(1)字及无符号字节的
Load/Store
指令的寻址方式。
(2)杂类
Load/Store
指令的寻址方式。
(3)批量
Load/Store
指令的寻址方式。
(4)协处理器
Load/Store
指令的寻址方式。
1.字及无符号字节的 Load/Store
指令的寻址方式
字及无符号字节的
Load/Store
指令语法格式如下:
LDR|STR{<cond>}{B}{T} <Rd>,<addressing_mode>
其中,<addressing_mode>共有
9
种寻址方式,如表
3-2
所示。
表
3-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-indeted)
寄存器后索引寻址
8
[Rn],±<Rm>
(Register
post-indexed)
带移½的寄存器后索引寻址
9
[Rn],±<Rm>,<shift>#< offset_12>
(Scaled
register post-indexed)
模
式
上表中,
“!”表示完成数据传输后要更新基址寄存器。
2.杂类 Load/Store
指令的寻址方式
½用该类寻址方式的指令的语法格式如下:
LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>
53
4
ARM
处理器开发详解——基于
ARM Cortex-A8
处理器的开发设计(第
2
版)
½用该类寻址方式的指令包括(有符号/无符号)半字
Load/Store
指令、有符号字节
Load/Store
指令和双字
Load/Store
指令。
该类寻址方式分为
6
种类型,如表
3-3
所示。
表
3-3
杂类
Load/Store
指令的寻址方式
格
1
[Rn,#±<offset_8>]
式
立即数偏移寻址
(Immediate
offset)
寄存器偏移寻址
2
[Rn,±Rm]
(Register
offset)
立即数前索引寻址
3
[Rn,#±< offset_8>]!
(Immediate
pre-indexed)
寄存器前索引寻址
4
[Rn,±Rm]!
(Register
post-indexed)
立即数后索引寻址
5
[Rn],#±< offset_8>
(Immediate
post-indexed)
寄存器后索引寻址
6
[Rn],±<Rm>
(Register
post-indexed)
模
式
3.批量 Load/Store
指令寻址方式
批量
Load/Store
指令将一片连续内存单元的数据加½½到通用寄存器组中或将一组通用
寄存器的数据存储到内存单元中。
批量
Load/Store
指令的寻址模式产生一个内存单元的地址范围,指令寄存器和内存单
元的对应关系满足这样的规则,即编号½的寄存器对应于内存中½地址单元,编号高的寄
存器对应于内存中的高地址单元。
该类指令的语法格式如下:
LDM|STM{<cond>}<addressing_mode> <Rn>{!},<registers><^>
该类指令的寻址方式如表
3-4
所示。
表
3-4
批量
Load/Store
指令的寻址方式
格
1
2
3
4
IA(Increment After)
IB(Increment Before)
DA(Decrement After)
DB(Decrement Before)
式
后递增方式
先递增方式
后递减方式
先递减方式
模
式
4.堆栈操½寻址方式
堆栈操½寻址方式和批量
Load/Store
指令寻址方式十分类似。½对于堆栈的操½,数
据写入内存和从内存中读出要½用不同的寻址模式,
因为进栈操½
(Pop)
和出栈操½
(Push)
要在不同的方向上调整堆栈。
54
评论