arm指令集
跳转指令 实现流程的跳转
专门的跳转指令
b 跳转指令
格式:
B{条件}目标地址
示例代码如下:当cpsr寄存器中的z条件码置位时,程序跳转到标号label处执行
CMP R1,#0
BEQLable
指令条件
指令条件 标志位 含义
EQ Z置位 相等
NE Z清零 不相等
CS C置位 无符号数大于或等于
CC C清零 无符号数小于
MI N置位 负数
PL N清零 正数或零
VS V置位 溢出
VC V清零 未溢出
HI C置位Z清零 无符号数大于
LS C清零z置位 无符号数小于或等于
GE N等于V 带符号数大于或等于
LT N不等于V 带符号数小于
GT Z清零且(N等于V) 带符号数大于
LE Z置位或(N不等于V)带符号数小于或等于
AL 忽略 无条件执行
bl 带返回的跳转指令
在跳转之前,会把pc当前值保存到r14中
格式:
BL{条件} 目标地址
blx 带返回和状态切换的跳转指令
将处理器的工作状态从arm状态切换到thumb状态,同时将pc当值存入r14中
bx 带状态切换的跳转指令
直接向程序计数器写入跳转地址
mov lr,pc
---------------------------------------------------------------------
数据处理指令
数据传送指令,算述逻辑运算指令和比较指令
mov
从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器
s选项决定指令的操作是否影响cpsr中条件标志们的值,没有s时不更新标志位
格式:
mov{条件}{S}目的寄存器 源操作数
示例代码如下:
mov r1,r0;将寄存器r0的值传送到寄存器r1
mov pc,r14;
mov r1,r0,lsl#3; 将寄存器r0的值左移3位后传送到r1
注:源操作数不能是间接寻址,mov指令不能在寄存器和内存间使用
mvn
从一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器
与mov指令不同的是在传送前按位取反了
格式:
mvn{条件}{s} 目的寄存器 源操作数
示例代码如下:
mvn r0,#0xff; r0<---0xffffff00
cmp
把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新cpsr中条件标志位的值(进行一次减法运算)
格式:
cmp{条件}操作数1,操作数2
示例代码如下:
cmp r1,r0;
cmp r1,#100;
tst
把一个寄存器的内容和另一个寄存器的内容或立即数进行按位与运算,更新cpsr
格式:
tst{条件} 操作数1,操作数2
示例代码如下:
tst r1,#%1;测试在寄存器r1中是否设置了最低位
add
把两个数相加
格式:
add{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
add r0,r1,r2; r0=r1+r2
add r0,r1,#256; r0=r1+256
add r0,r2,r3,lsl#1; r0=r2+(r3<<1)
sub
把操作数1减去操作数2
格式:
sub r0,r1,r2; r0=r1-r2
sub r0,r1,#256; r0=r1-256
sub r0,r2,r3,lsl#1; r0=r2-(r3<<1)
and
在两个操作数上进行逻辑与运算,结果放到目的寄存器中
常用于屏蔽操作数1的某些位
格式:
and{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
and r0,r0,#3; 保持r0的0、1位,其余位清零
orr
在两个操作数上进行逻辑或运算,结果放到目的寄存器
常用于设置操作数1的某些位
格式:
orr{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
orr r0,r0,#3;设置r0的0、1位,其余位不变
bic
用于清除rn中的某些位,结果存放在rd中,operand2为32位的掩码
如果掩码中设置某一位为1,则该位清零
格式:
bic{cond}{S}Rd,Rn,operand2
示例代码如下:
bic r0,r0,#%1011;将r0的0、1、3位清零
mul
将操作数1与操作数2相乘,结果存放到目的寄存器中
格式:
mul{条件}{S}目的寄存器,操作数1,操作数2
示例代码如下:
mul r0,r1,r2; r0=r1*r2
muls r0,r1,r2; r0=r1*r2 同时设置cpsr中的条件标志位
------------------------------------------------------------
程序状态寄存器访问指令
mrs
将程序状态寄存器的内容传送到通用寄存器中
格式:
mrs{条件}通用寄存器,程序状态寄存器
示例代码如下:
mrs r0,cpsr; 传送cpsr的内容到r0
mrs r0,spsr; 传送spsr的内容到r0
msr
将操作数的内容传送到程序状态寄存器的特定域中
操作数可以为通用寄存器或立即数
<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域
位[31:24]条件标志位域,用f表示
位[23:16]为状态位域,用s表示
位[15:8]为扩展位域,用x表示
位[7:0]为控制位域,用c表示
格式:
msr{条件}程序状态寄存器_<域>,操作数
示例代码如下:
msr cpsr,r0; 传送r0的内容到cpsr
msr spsr,r0; 传送r0的内容到spsr
msr cpsr_c,r0; 传送r0的内容到spsr,但仅仅修改cpsr中的控制位域
加载/存储指令
用于寄存器和存储器之间传输数据
ldr
从存储器中将一个32位的字数据传送到目的寄存器
ldr{条件}目的寄存器,<存储地址>
示例代码如下:
ldr r0,[r1]; r0=r1
ldrb r0,[r1]; 将寄存器地址为r1的(8位)字数据写入r0,将r0的高24位清零
ldrh r0,[r1]; 将以寄存器地址为r1的(16位)半字数据定入r0,将r0的高16位清零
str
从寄存器中将一个32位的字数据传送到存储器中
str{条件}源寄存器,<存储器地址>
示例代码如下:
str r0,[r1],#8; 将r0中的字数据写入以r1为地址的存储器中,并将新地址 r1+8写入r1
str r0,[r1,#8]; 将r0中的字数据写入以r1+8为地址的存储器中
批量加载/存储指令
一次在一片连续的存储器和多个寄存器之间传送数据
ldm
用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据
将多个寄存器的内容入栈或出栈
ldm{条件}{类型}基址寄存器{!},寄存器列表{^}
类型:
IA 每次传送后地址加1
IB 每次传送前地址加1
DA 每次传送后地址减1
DB 每次传送前地址减1
FD 满递减堆栈
ED 空递减堆栈
FA 满递增堆栈
EA 空递增堆栈
{!} 为可选后缀,如果选用,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不变.基址寄存器不允许为r15
{^} 为可选后缀,当指令为ldm且寄存器列表中包含r15,选用该后缀时表示:除了正常的数据传送之外,还将spsr复制到cpsr
示例代码如下:
ldmfd r13!,{r0,r4-r12,pc}; 将堆栈内容恢复到寄存器
stm
stm{条件}{类型}基址寄存器{!},寄存器列表{^}
示例代码:
stmfd r13!,{r0,r1}; 将寄存器列表中的寄存器存入堆栈
数据交换指令
在存储器和寄存器之间交换数据
swp 字数据交换指令
swp{条件}目的寄存器,源寄存器1,[源寄存器2]
将源寄存器2所指向的存储器中的字节数据传送到目的寄存器
将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中
(当源寄存器1和目的寄存器为同一个寄存器时,该指令就实现寄存器和存储器的内容的交换)
swp r0,r1,[r2];
swp r0,r0,[r1];
swpb 字节数据交换指令
移位指令
不作为单独的指令使用,只能作为指令格式中的一个字段
lsl 逻辑左移 (相当于乘)
通用寄存器,lsl操作数
示例代码如下:
mov r0,r1,lsl#2; 将r1中的内容左移两位后传送到r0
asl 算术左移(等价于lsl)
lsr 逻辑右移
asr 算术右移
ror 循环右移(相当于除)
异常产生指令
swi 软件中断指令
产生软件中断,以便用户程序能调用操作系统的api
swi{条件}24位立即数
示例代码如下:
swi 0x02 调用操作系统编号位02的系统例程
bkpt 断点中断指令
上一篇:arm学习笔记二(arm寻址方式)
下一篇:arm学习笔记四(arm伪指令)
设计资源 培训 开发板 精华推荐
- AD8602ARZ 低侧运算放大器电流监视器的典型应用
- 使用 Analog Devices 的 LT3089IR 的参考设计
- RYZの电机驱动
- 【训练营_基础班】FE1.1S一拖四集线器+636382A
- Protues仿真实例(8051)-播放音乐
- 使用 Analog Devices 的 LT1249CN8 的参考设计
- MIC94345-MYCS 2.8V 输出电压、500mA LDO 采用纹波阻断技术的典型应用
- ADZS-BF609-EZBRD、基于 Blackfin 数字信号处理器 (DSP) 的 ADSP-BF609 EZ-Board 评估系统
- 用于计量的 ±18V 差动放大器
- TPS563201 DCDC电源模块