|
ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处理器指令和异常中断产生指令。根据使用的指令类型不同,指令的寻址方式分为数据处理指令寻址方式和内存访问指令寻址方式。本文主要介绍一下ARM数据处理指令寻址方式。
数据处理指令的基本语法格式如下:
<opcode> {<cond>} {S} <Rd>,<Rn>,<shifter_operand>
其中,<shifter_operand>有11种形式,如表1-1所示。
表1-1 <shifter_operand>的寻址方式
语 法 寻 址 方 式
1 #<immediate> 立即数寻址
2 <Rm> 寄存器寻址
3 <Rm>, LSL #<shift_imm> 立即数逻辑左移
4 <Rm>, LSL <Rs> 立即数逻辑左移
5 <Rm>, LSR #<shift_imm> 立即数逻辑右移
6 <Rm>, LSR <Rs> 寄存器逻辑右移
7 <Rm>, ASR #<shift_imm> 立即数算术右移
8 <Rm>, ASR <Rs> 寄存器算术右移
9 <Rm>, ROR #<shift_imm> 立即数循环右移
10 <Rm>, ROR <Rs> 寄存器循环右移
11 <Rm>, RRX 寄存器扩展循环右移
数据处理指令寻址方式可以分为以下几种。
(1)立即数寻址方式;
(2)寄存器寻址方式;
(3)寄存器移位寻址方式。
1.立即数寻址方式
指令中的立即数是由一个8bit的常数移动4bit偶数位(0,2,4,…,26,28,30)得到的。所以,每一条指令都包含一个8bit的常数X和移位值Y,得到的立即数 = X循环右移(2×Y)。如图1-1所示
图1-1 立即数表示方法
下面列举了一些有效的立即数:
0xFF、0x104、0xFF0、0xFF00、0xFF000、0xFF000000、0xF000000F
下面是一些无效的立即数:
0x101、0x102、0xFF1、0xFF04、0xFF003、0xFFFFFFFF、0xF000001F
下面是一些应用立即数的指令:
MOV R0,#0 ;送0到R0
ADD R3,R3,#1 ;R3的值加1
CMP R7,#1000 ;R7的值和1000比较
BIC R9,R8,#0xFF00 ;将R8中8~15位清零,结果保存在R9中
2.寄存器寻址方式
寄存器的值可以被直接用于数据操作指令,这种寻址方式是各类处理器经常采用的一种方式,也是一种执行效率较高的寻址方式,如:
MOV R2,R0 ;R0的值送R2
ADD R4,R3,R2 ;R2加R3,结果送R4
CMP R7,R8 ;比较R7和R8的值
3.寄存器移位寻址方式
寄存器的值在被送到ALU之前,可以事先经过桶形移位寄存器的处理。预处理和移位发生在同一周期内,所以有效地使用移位寄存器,可以增加代码的执行效率。
下面是一些在指令中使用了移位操作的例子:
ADD R2,R0,R1,LSR #5
MOV R1,R0,LSL #2
RSB R9,R5,R5,LSL #1
SUB R1,R2,R0,LSR #4
MOV R2,R4,ROR R0
ARM书籍推荐《ARM系列处理器应用技术完全手册》 |
|