格式:opcode{cond}{s} Rd, Rn, shifter_operand
opcode : 指令码
cond : 条件码 默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位 指令的执行结果会影响cpsr的NZCV位
Rd : 目标寄存器 运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器
shifter_operand : 第二个操作数 1> 可以是一个普通的寄存器 2> 可以是一个立即数 3> 可以是经过移位操作的寄存器
1.基本的数据处理指令
数据搬移指令
opcode{cond}{s} Rd, shifter_operand
1. mov:将操作数搬移到寄存器中
2. mvn:将操作数按位取反后搬移到目标寄存器中
mov r0,#0XFF @将0XFF搬移到r0寄存器中
mvn r1,#0XFF @将0XFF按位取反结果存放到R1寄存器中
数据移位指令
格式:opcode{cond}{s} Rd, Rn, shifter_operand
lsl:左移运算 低位补0
lsr:右移运算 高位补0
ror:循环右移 低位移出的数据补到最高位
mov r0,#0XFF
lsl r1,r0,#4 @ 将r0的值左移4位结果放到r1中 R1==0XFF0
lsr r2,r0,#4 @将r0的值右移4位结果放到r2中 R2==0XF
ror r3,r0,#4 @ 将r0的值循环右移4位结果放到r3中 R3==0XF000000F
算数运算指令
格式:opcode{cond}{s} Rd, Rn, shifter_operand
1.add :进行加法运算
2.adc:进行加法运算的时候考虑到CPSR的c位
3.sub:进行减法运算
4.sbc:进行减法运算时考虑到CPSR的C位
5.mul:乘法运算
位运算指令
格式:opcode{cond}{s} Rd, Rn, shifter_operand
1. and:按位与 与0清0,与1不变
2. orr:按位或 或1置1 或0不变
3. eor:按位异或 相同为0 不同为1
4. bic:按位清0 想要哪一位设置为0,只需要将这一位用bic指令和相同位为1的数进行运算
比较指令
格式: opcode Rn, shifter_operand
opcode:比较指令的指令码是cmp
功能:将第一操作寄存器和第二操作数的值进行比较
本质:比较指令的本质就是拿进行比较的两个数值进行减法运算,并且减法运算的结果会影响到CPSR的条件位
我们可以根据条件位的数值进行两个数值的判断,再根据判断的结果做不同的操作
一般比较指令和条件码都是一起使用的
2.跳转指令
格式:opcode{cond} label
功能:跳转到指定的标签下
功能码:
1. b :跳转到指定的标签下,返回地址不保存
2. bl:跳转到指定的标签下,返回地址保存至 LR寄存器中
3.内存读写指令
指令码{条件码} 目标寄存器 [目标地址]
str r1,[r0]:将目标寄存器的数值写入到目标地址对应的内存中
ldr r1,[r0]:从目标地址中读取一个字的数据到目标寄存器中
写:
str:向指定的内存中写入一个字的数据
strh:向内存中写入半个字的数据
strb:向内存中写入一个字节的数据
读:
ldr:从内存中读取一个字的数据
ldrh:从内存中读取半个字的数据
ldrb:从内存中读取一个字节的数据
1.前索引
mov r0,#0X40000000
mov r1,#0XFFFFFFFF
STR R1,[R0,#8] @将r1的数值写入到0X40000000+8内存位置
LDR R2,[R0,#8]@读取R0+8对应的地址内存中一个字的数据到R2中
2.后索引
mov r0,#0X40000000
mov r1,#0XFFFFFFFF
STR R1,[R0],#8 @将r1的数值写入到R0数值为首地址的内存位置
@R0的数值+8
3.自动索引
mov r0,#0X40000000
mov r1,#0XFFFFFFFF
STR R1,[R0,#8]! @将r1的数值写入到R0+8数值为首地址的内存位置
@R0d的数值+8
4.程序状态寄存器读写指令
读:
MRS Rd,CPSR:将CPSR寄存器的数值读取到目标寄存器中
写:
MSR cpsr,操作数:将操作数写道CPSR寄存器中
1.USER模式作为唯一的非特权模式,我们不可以直接修改CPSR的数值将模式切换为其他特权模式,为了保护系统
2.想要从USER模式切换到其他模式,需要特定的异常出现,才可以切换到对应的模式
5.软中断指令
swi 中断号
注意:
1.swi是软中断的指令码
2.中断号是系统中中断的标识,这里的中断号是一个由24位数据组成的一个立即数。