ARM微处理器的指令集概述二——ARM应用系统开发详解笔记
一 跳转指令
跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转:
— 使用专门的跳转指令。
— 直接向程序计数器 PC 写入跳转地址值。
ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下 4 条指令:
— B 跳转指令
— BL 带返回的跳转指令
— BLX 带返回和状态切换的跳转指令
— BX 带状态切换的跳转指令
B
B{条件} 目标地址B指令是最简单的跳转指令。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址) 它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后 32MB的地址空间)。
BL 指令
BL{条件} 目标地址
BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。例:
BL Label ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中。
BLX 指令
BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态。该指令同时将PC的当前内容保存到寄存器R14 中。
BX 指令
BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。
二 数据处理指令
数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据处理指令包括:MOV 数据传送指令、MVN 数据取反传送指令、CMP 比较指令、CMN 反值比较指令、 TST 位测试指令、 TEQ 相等测试指令、 ADD 加法指令、 ADC 带进位加法指令、 SUB 减法指令、 SBC 带借位减法指令、 RSB 逆向减法指令、 RSC 带借位的逆向减法指令、 AND 逻辑与指令、 ORR 逻辑或指令、 EOR 逻辑异或指令、 BIC 位清除指令。
MOV 指令
MOV{条件}{S} 目的寄存器,源操作数
MOV 指令将源操作数加载到目的寄存器。其中 S 选项决定指令的操作是否影响 CPSR 中条件标志位的值,当没有 S 时指令不更新 CPSR中条件标志位的值。例:
MOV R1,R0,LSL#3 ; 将寄存器 R0 的值左移 3 位后传送到 R1。
MVN 指令
MVN{条件}{S} 目的寄存器,源操作数
MOV 指令不同之处是在传送之前将源操作数按位被取反。例:
MVN R0, #0; 将立即数 0 取反传送到寄存器 R0 中,完成后 R0=-1。
CMP 指令
CMP{条件} 操作数 1,操作数 2比较操作数1和操作数2,更新CSPR不保存结果。标志位表示的是操作数 1 与操作数 2 的关系(大、小、相等)。例如,当操作数 1 大于操作操作数 2,则此后的有GT 后缀的指令将可以执行。例:
CMP R1,#100 ;将寄存器 R1 的值与立即数 100 相减,并根据结果设置 CPSR 的标志位
CMN 指令
CMN{条件} 操作数 1,操作数 2
实际完成操作数 1 和操作数 2 相加,并根据结果更改条件标志位。例:
CMN R1,R0 ;将寄存器 R1 的值与寄存器 R0 的值相加,并根据结果设置 CPSR
TST 指令
TST{条件} 操作数 1,操作数 2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数 1 是要测试的数据,而操作数 2 是一个位掩码,该指令一般用来检测是否设置了特定的位。例:
TST R1,#0xffe ;将寄存器 R1 的值与立即数 0xffe 按位与,并根据结果设置 CPSR
TEQ 指令
TEQ{条件} 操作数 1,操作数 2
TEQ指令用于 把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数 1 和操作数2 是否相等。例:
TEQ R1,R2 ;将寄存器 R1 的值与寄存器 R2 的值按位异或,并根据结果设置 CPSR
ADD 指令
ADD{条件}{S} 目的寄存器,操作数 1,操作数 2
ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 < 1)
ADC 指令
ADC{条件}{S} 目的寄存器,操作数 1,操作数 2
ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比 32 位大的数的加法,注意不要忘记设置S后缀来更改进位标志。以下指令序列完成两个 128 位数的加法,第一个数由高到低存放在寄存器 R7~R4,第二个数由高到低存放在寄存器 R11~R8,运算结果由高到低存放在寄存器 R3~R0:
ADDS R0,R4,R8 ; 加低端的字
ADCS R1,R5,R9 ; 加第二个字,带进位
ADCS R2,R6,R10 ; 加第三个字,带进位
ADC R3,R7,R11; 加第四个字,带进位
SUB 指令
SUB{条件}{S} 目
ARM微处理器指令 相关文章:
- ARM应用系统开发详解:第3章 ARM微处理器的指令系统(11-20)
- ARM微处理器的指令集概述四——MOV和LDR的区别(11-20)
- ARM微处理器的指令集概述一——ARM应用系统开发详解笔记(11-20)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)