• 沒有找到結果。

ARM 数据处理指令

在文檔中 1.1 嵌入式系统 (頁 83-88)

第4章 ARM7TDMI(-S)指令系统

4. ARM 数据处理指令

数据处理指令大致可分为3 类:数据传送指令(如 MOV、MVN)、算术逻辑运算指令(如 ADD、SUB、AND),比较指令(如 CMP、TST)。数据处理指令只能对寄存器的内容进行操 作。所有 ARM 数据处理指令均可选择使用 S 后缀,并影响状态标志。比较指令CMP、CMN、

TST 和 TEQ 不需要后缀 S,它们会直接影响状态标志。

ARM 数据处理指令见表 4.4。

表 4.4 ARM 数据处理指令

助记符 说明 操作 条件码位置

MOV Rd,operand2 数据传送 Rd←operand2 MOV{cond}{S}

MVN Rd,operand2 数据非传送 Rd←(~operand2) MVN{cond}{S}

ADD Rd, Rn, operand2 加法运算指令 Rd←Rn+operand2 ADD{cond}{S}

SUB Rd, Rn, operand2 减法运算指令 Rd←Rn-operand2 SUB{cond}{S}

RSB Rd, Rn, operand2 逆向减法指令 Rd←operand2-Rn RSB{cond}{S}

ADC Rd, Rn, operand2 带进位加法 Rd←Rn+operand2+Carry ADC{cond}{S}

SBC Rd, Rn, operand2 带进位减法指令 Rd←Rn-operand2-(NOT)Carry SBC{cond}{S}

RSC Rd, Rn, operand2 带进位逆向减法指令 Rd←operand2-Rn-(NOT)Carry RSC{cond}{S}

AND Rd, Rn, operand2 逻辑与操作指令 Rd←Rn & operand2 AND{cond}{S}

ORR Rd, Rn, operand2 逻辑或操作指令 Rd←Rn | operand2 ORR{cond}{S}

EOR Rd, Rn, operand2 逻辑异或操作指令 Rd←Rn ^ operand2 EOR{cond}{S}

BIC Rd, Rn, operand2 位清除指令 Rd←Rn & (~operand2) BIC{cond}{S}

CMP Rn, operand2 比较指令 标志N、Z、C、V←Rn-operand2 CMP{cond}

CMN Rn, operand2 负数比较指令 标志N、Z、C、V←Rn+operand2 CMN{cond}

TST Rn, operand2 位测试指令 标志N、Z、C、V←Rn & operand2 TST{cond}

TEQ Rn, operand2 相等测试指令 标志N、Z、C、V←Rn ^ operand2 TEQ{cond}

ARM 数据处理指令编码格式:

opcode 数据处理指令操作码。

I 用于区别立即数(I 为 1)或寄存器移位(I 为 0)。

S 设置条件码。

Rn 第一操作数寄存器。

Rd 目标寄存器。

operand2 第二个操作数。

若指令不需要全部的可用操作数时(如 MOV 指令的 Rn),不用的寄存器域应设置为 0(由 编译器自动完成)。对于比较指令,b20 位固定为 1。ARM 数据处理指令操作码见表 4.5。

- - 74

表 4.5 ARM 数据处理指令操作码

操作码 指令助记符 说明

0000 AND 逻辑与操作指令

0001 EOR 逻辑异或操作指令

0010 SUB 减法运算指令

0011 RSB 逆向减法指令

0100 ADD 加法运算指令

0101 ADC 带进位加法

0110 SBC 带进位减法指令

0111 RSC 带进位逆向减法指令

1000 TST 位测试指令

1001 TEQ 相等测试指令

1010 CMP 比较指令

1011 CMN 负数比较指令

1100 ORR 逻辑或操作指令

1101 MOV 数据传送

1110 BIC 位清除指令

1111 MVN 数据非传送

数据传送指令

MOV——数据传送指令

MOV 将 8 位图(pattern)立即数或寄存器(operand2)传送到目标寄存器(Rd),可用于移位 运算等操作。指令格式如下:

MOV{cond}{S} Rd,operand2

MOV 指令举例如下:

MOV R1,#0x10 ; R1=0x10 MOV R0,R1 ; R0=R1

MOVS R3,R1,LSL #2 ; R3=R1<<2,并影响标志位 MOV PC,LR ; PC=LR,子程序返回

MVN——数据非传送指令

MVN 指令将 8 位图(pattern)立即数或寄存器(operand2)按位取反后传送到目标寄存器 (Rd),因为其具有取反功能,所以可以装载范围更广的立即数。指令格式如下:

MVN{cond}{S} Rd,operand2

MVN 指令举例如下:

MVN R1,#0xFF ; R1=0xFFFFFF00 MVN R1,R2 ; 将R2 取反,结果存到 R1

算术逻辑运算指令

ADD——加法运算指令

ADD 指令将 operand2 的值与 Rn 的值相加,结果保存到 Rd 寄存器。指令格式如下:

- - 75 ADD{cond}{S} Rd,Rn, operand2

ADD 指令举例如下:

ADDS R1,R1,#1 ; R1=R1+1 ADD R1,R1,R2 ; R1=R1+R2 ADDS R3,R1,R2,LSL #2 ; R3=R1+R2<<2

SUB——减法运算指令

SUB 指令用寄存器 Rn 减去 operand2,结果保存到 Rd 中。指令格式如下:

SUB{cond}{S} Rd,Rn, operand2

SUB 指令举例如下:

SUBS R0,R0,#1 ; R0=R0-1 SUBS R2,R1,R2 ; R2=R1-R2 SUB R6,R7,#0x10 ; R6=R7-0x10

RSB——逆向减法指令

RSB 指令将 operand2 的值减去 Rn,结果保存到 Rd 中。指令格式如下:

RSB{cond}{S} Rd,Rn, operand2

RSB 指令举例如下:

RSB R3,R1,#0xFF00 ; R3=0xFF00-R1 RSBS R1,R2,R2,LSL #2 ; R1=R2<<2-R2=R2×3 RSB R0,R1,#0 ; R0=-R1

ADC——带进位加法指令

将operand2 的值与 Rn 的值相加,再加上 CPSR 中的 C 条件标志位,结果保存到 Rd 寄 存器。指令格式如下:

ADC{cond}{S} Rd,Rn, operand2

ADC 指令举例如下:

ADDS R0,R0,R2

ADC R1,R1,R3 ; 使用ADC 实现 64 位加法,(R1、R0)=(R1、R0)+(R3、R2)

SBC——带进位减法指令

SBC 指令用寄存器 Rn 减去 operand2,再减去 CPSR 中的 C 条件标志位的非(即若 C 标 志清零,则结果减去1),结果保存到 Rd 中。指令格式如下:

SBC{cond}{S} Rd,Rn, operand2

SBC 指令举例如下:

SUBS R0,R0,R2

SBC R1,R1,R3 ; 使用SBC 实现 64 位减法,(R1、R0)=(R1、R0)-(R3、R2)

RSC——带进位逆向减法指令

- - 76

RSB 指令用寄存器 operand2 减去 Rn,再减去 CPSR 中的 C 条件标志位,结果保存到 Rd 中。指令格式如下:

RSC{cond}{S} Rd,Rn, operand2

RSC 指令举例如下:

RSBS R2,R0,#0

RSC R3,R1,#0 ; 使用RSC 指令实现求 64 位数值的负数

AND——逻辑“与”操作指令

AND 指令将 operand2 的值与寄存器 Rn 的值按位作逻辑“与”操作,结果保存到 Rd 中。

指令格式如下:

AND{cond}{S} Rd,Rn, operand2

AND 指令举例如下:

ANDS R0,R0,#0x01 ; R0=R0&0x01,取出最低位数据 AND R2,R1,R3 ; R2=R1&R3

ORR——逻辑“或”操作指令

ORR 指令将 operand2 的值与寄存器 Rn 的值按位作逻辑“或”操作,结果保存到 Rd 中。

指令格式如下:

ORR{cond}{S} Rd,Rn, operand2

ORR 指令举例如下:

ORR R0,R0,#0x0F ; 将R0 的低 4 位置 1 MOV R1,R2,LSR #24

ORR R3,R1,R3,LSL #8 ; 使用 ORR 指令将 R2 的高 8 位数据移入到 R3 低 8 位中

EOR——逻辑“异或”操作指令

EOR 指令将 operand2 的值与寄存器 Rn 的值按位作逻辑“异或”操作,结果保存到 Rd 中。指令格式如下:

EOR{cond}{S} Rd,Rn, operand2

EOR 指令举例如下:

EOR R1,R1,#0x0F ; 将 R1 的低 4 位取反 EOR R2,R1,R0 ; R2=R1^R0

EORS R0,R5,#0x01 ; 将R5 和 0x01 进行逻辑异或,结果保存到 R0,并影响标志位

BIC——位清除指令

BIC 指令将寄存器 Rn 的值与 operand2 的值的反码按位作逻辑“与”操作,结果保存到 Rd 中。指令格式如下:

BIC{cond}{S} Rd,Rn, operand2

BIC 指令举例如下:

BIC R1,R1,#0x0F ; 将 R1 的低 4 位清零,其它位不变

- - 77

BIC R1,R2,R3 ; 将 R3 的反码和 R2 相逻辑“与”,结果保存到 R1 中

比较指令

CMP——比较指令

CMP 指令将寄存器 Rn 的值减去 operand2 的值,根据操作的结果更新 CPSR 中的相应条 件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:

CMP{cond} Rn, operand2

CMP 指令举例如下:

CMP R1,#10 ; R1 与 10 比较,设置相关标志位 CMP R1,R2 ; R1 与 R2 比较,设置相关标志位

CMP 指令与 SUBS 指令的区别在于 CMP 指令不保存运算结果。在进行两个数据的大小 判断时,常用CMP 指令及相应的条件码来操作。

CMN——负数比较指令

CMN 指令使用寄存器 Rn 的值加上 operand2 的值,根据操作的结果更新 CPSR 中的相 应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:

CMN{cond} Rn, operand2 CMN 指令举例如下:

CMN R0,#1 ; R0+1,判断 R0 是否为 1 的补码。若是,则 Z 置位

CMN 指令与 ADDS 指令的区别在于 CMN 指令不保存运算结果。CMN 指令可用于负数 比较,比如CMN R0,#1 指令则表示 R0 与-1 比较,若 R0 为-1(即 1 的补码),则 Z 置位;

否则Z 复位。

TST——位测试指令

TST 指令将寄存器 Rn 的值与 operand2 的值按位作逻辑“与”操作,根据操作的结果更 新CPSR 中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令 格式如下:

TST{cond} Rn, operand2

TST 指令举例如下:

TST R0,#0x01 ; 判断R0 的最低位是否为 0 TST R1,#0x0F ; 判断R1 的低 4 位是否为 0

TST 指令与 ANDS 指令的区别在于 TST 指令不保存运算结果。TST 指令通常与 EQ、

NE 条件码配合使用,当所有测试位均为 0 时,EQ 有效,而只要有一个测试位不为 0,则 NE 有效。

TEQ——相等测试指令

TEQ 指令将寄存器 Rn 的值与 operand2 的值按位作逻辑“异或”操作,根据操作的结果 更新CPSR 中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指 令格式如下:

- - 78 TEQ{cond} Rn, operand2

TEQ 指令举例如下:

TEQ R0,R1 ; 比较 R0 与 R1 是否相等 (不影响 V 位和 C 位)

TEQ 指令与 EORS 指令的区别在于 TEQ 指令不保存运算结果。使用 TEQ 进行相等测试 时,常与EQ、NE 条件码配合使用。当两个数据相等时,EQ 有效;否则 NE 有效。

在文檔中 1.1 嵌入式系统 (頁 83-88)