ARM裸机开发笔记5ARM指令集
以下指令中可以完成从当前指令向前或向后的32M的地址空间的跳转
B{条件} 目标地址 ;花括号表示条件,可以省略
最简单的跳转指令,一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行
CMP R!,#0
BEQ Label ;EQ相等
当CPSR寄存器中的Z条件码位置时,程序跳转到标号Label处执行
BL
BL{条件} 目标地址
跳转之前,会在寄存器R14中保存PC当前值。因此可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。
BLX
X表示跳转到指定地址的同时,将工作状态从ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到R14中
因此当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态,同时,子程序的返回可以通过将寄存器R14值到PC中来完成。
BX 跳转并切换状态
数据处理指令
MOV指令
MOV{条件}{S} 目标寄存器,源操作数 ----------》S加上可能会影响CPSR中的标志位。不加指令不更新CPSR。一般都不加。源操作数不可以是内存
MVN{条件}{S} 在传送之前把源操作数按位取反
CMP指令
TST指令 测试某一个位是否被设置了
TST R1,#%1 结果 ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)对操作数1与操作数2进行按位的与运算,结果为0 ,EQ位将被设置
LDR R5,=0xffffffff
TST R5,#(1<23) ;当bit23位为1时,CPSR EQ位被设置
MOVEQ R5,#0x00 ---->不执行词语据,不满足EQ
MOVNE R5,#0x01
ADD指令 加
SUB指令 减
AND 逻辑与
ORR 逻辑或
BIC Rd,Rn,operand2 用于将Rn中的某些位清零。并把结果存放在Rd中,操作数operand2为32位的掩码,如果掩码设置了某一位为1,则清除这一位。
BIC R0,R0,#%1011 ;将R0的0,1,3位清零,其余位保持不变。
MUL乘法指令
程序状态字的访问指令
MRS{条件} 通用寄存器,程序状态寄存器(CPSR/SPSR)
将程序状态寄存器的内容传送到通用寄存器中
1.当需要改变程序状态寄存器内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
2.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
MRS R0,SPSR ;传送CPSR的内容到R0
MSR指令
MSR 程序状态寄存器(CPSR/SPSR)_<域> ,操作数
将操作数的内容传送到程序状态寄存器或其特定域中。其中操作数可以是通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可以分为4个域
位为条件标志位,用f表示。位为状态域位,用s表示。为为扩展位域,用x表示。为为控制位域,用c表示
该指令通常用于或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
MSR CPSR,R0
MSR SPSR,R0 ;传送R0内容带SPSR
MSR CPSR_c,R0 ;传送R0到CPSR,但仅仅修改CPSR中的控制位域
访问内存
寄存器和存储器之间传送数据
加载和存储指令
LDR 目地寄存器,<存储器地址>
从存储器中将一个32位数据传送到目地寄存器中
LDRB 目的寄存器,<存储器地址>
LDRB用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。
LDRH
和LDRB操作类似,是取一个16位的数据
STR 源寄存器,<存储器地址>
STR从源寄存器中将一个32为的字数据传到存储器中
批量加载存储指令
LDM
STM
数据交换指令
SWP
SWPB
移位指令(逻辑移位不考虑正负号,算数移位考虑正负号)
LSL 逻辑左移
ASL 算数左移
LSR 逻辑右移
ASR 算数右移
ROR 循环右移
异常产生指令
ARM支持的异常产生指令有如下两条
SWI:软件中断指令
BKPT:断点中断指令
ARM裸机开发指令 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)