汇编的组成
- 汇编指令
- 数据处理指令
- 数据搬移指令
- 数据位移指令
- 位运算指令
- 算术运算指令
- 比较指令
- 跳转指令
- 内存读写指令
- 状态寄存器传送指令
- 异常产生指令
- 协处理器指令
- 数据处理指令
- 伪操作
- 在程序编译过程中起到编译引导作用的内容
- .text .global .if .else .endif
- 伪指令
- 不是汇编指令,但是可以起到指令的作用,会占用一定内存空间
- 注释
- 单行注释:@ ;
- 多行注释:/* */
- 条件注释:.if .else .endif
立即数
循环左移偶数位,取反(或不取)能得到0-255之间的数(8位以内)就是立即数
数据搬移指令
mov{条件码} 目标寄存器 操作数
功能:将操作数搬移到目标寄存器中,相当于赋值
mvn{条件码} 目标寄存器 操作数
功能:将操作数按位取反后结果搬移到目标寄存器中
注意:操作数可以是一个寄存器,也可以是一个立即数
数据移位指令
逻辑左移
lsl{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能:将第一操作寄存器中的数左移第二操作数位数,将结果保存到目标寄存器中
逻辑右移
lsr{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能:将第一操作寄存器中的数右移第二操作数位数,将结果保存到目标寄存器中
循环右移
ror{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能:将第一操作寄存器中的数循环右移第二操作数位数,将结果保存到目标寄存器中
补充:汇编中对操作数书写的形式可以写成c语言风格的移位运算形式
ex:LSL R1,R0,#(0X1<<2)
位运算指令
与运算(and),与0清零,与1不变
and{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能: 将第一操作寄存器中的数和第二操作数进行与运算,将结果保存到目标寄存器中
或运算(orr),有1位1,全0为0
orr{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能: 将第一操作寄存器中的数和第二操作数进行或运算,将结果保存到目标寄存器中
异或运算(eor),相同为0,不同为1
eor{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能: 将第一操作寄存器中的数和第二操作数进行异或运算,将结果保存到目标寄存器中
按位取反(mvn),0为1,1为0
mvn{条件码} 目标寄存器,第一操作寄存器,第二操作数
功能: 将第一操作寄存器中的数和第二操作数进行按位取反运算,将结果保存到目标寄存器中
按位清零(bic),指定位和1运算零
算术运算指令
加法指令
add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
功能: 目标寄存器=第一操作寄存器+第二操作数
包含cpsr条件位的加法指令
adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
功能: 目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值
减法指令
sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
功能: 目标寄存器=第一操作寄存器-第二操作数
包含cpsr条件位的减法指令
sbc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
功能: 目标寄存器=第一操作寄存器+-第二操作数-cpsr寄存器c位的取反值
乘法指令
mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
功能: 目标寄存器=第一操作寄存器*第二操作数
模拟32位处理器进行64位数据运算
32位处理器一条指令最大能进行32位数据运算,想要进行64位运算,需要多条指令
第一个64位数据:
0x00000003 FFFFFFFE
第二个64位数据
0X00000005 00000006
运算原则:
低32位先运算,结果会影响cpsr条件位
高32位后运算,运算过程包含cpsr条件位