汇编的语法和相关指令使用
1.汇编指令的基本格式:
<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>;
解释: opcode:指令的功能码,用来表示当前指令的作用
cond:条件码,可以不写,如果写了,需要在指令执行之前先判断条件受否满足,不满足则指令不执行
s:可以不写,如果在指令码后面加了一个s,则进行运算时运算的结果会影响到CPSR条件位
Rd:目标寄存器
Rn:第一操作寄存器 shifter_operand:第二操作数
连起来解释:先判断条件码对应的条件是否满足,如果满足,则让第一操作寄存器和第二操作数按照指令功能码进行数据运算,运算的结果会保存到目标寄存器中,如果功能码后面加了s,结果会影响到CPSR条件位 注意: 1.第一操作寄存器只能是寄存器,不能写数值 2.第二操作数可以写寄存器名,也可以写一个数值,如果写数值,需要在数值前加# 3.汇编指令不区分大小写
2.数据搬移指令
1.mov{条件码} 目标寄存器 操作数 解释:将操作数搬移到目标寄存器中
2.mvn{条件码} 目标寄存器 操作数 解释:将操作数按位取反后结果搬移到目标寄存器中
注意: 1.操作数可以是一个寄存器,也可以是一个立即数
3.数据移位指令
1.逻辑左移: lsl{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数据左移第二操作数位数,结果保存到目标寄存器中
2.逻辑右移 lsr{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数据右移第二操作数位数,结果保存到目标寄存器中
3.循环右移 ror{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数据循环右移第二操作数位数,结果保存到目标寄存器中
补充: 汇编中对操作数书写的形式可以写成c语言风格的移位运算形式
ex: LSL R1,R0,#(0X1<<2)
4.位运算指令
1.与运算 and{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数和第二操作数进行与运算,结果保存到目标寄存器中
2.或运算 orr{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数和第二操作数进行或运算,结果保存到目标寄存器中
3.异或运算 eor{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数和第二操作数进行异或运算,结果保存到目标寄存器中
4.按位取反 mvn
5.按位清零运算 bic{条件码} 目标寄存器,第一操作寄存器,第二操作数 解释:将第一操作寄存器的数和第二操作数进行与运算,结果保存到目标寄存器中
ex:
r0 ORR R0,R0,#(0x1<<5)
BIC R0,R0,#(0x1<<5)
and R0,R0,#(~(0x1<<5))
5.算数运算指令
1.加法指令 add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 解释:目标寄存器=第一操作寄存器+第二操作数
2.考虑cpsr条件位的加法指令 adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 解释:目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值
3.减法指令 sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 解释:目标寄存器=第一操作寄存器-第二操作数
4.考虑cpsr条件位的减法指令 SBC{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 解释:目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的取反值
5.乘法运算 mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 解释:目标寄存器=第一操作寄存器*第二操作数
6.比较指令
1.cmp 第一操作寄存器,第二操作数 解释:将第一操作数和第二操作寄存器进行比较 比较指令的本质就是比较的两个数进行减法运算,运算的结果应先到CPSR的NZCV位
2.tst 目标寄存器,#(0X1<<N) 解释:这个指令用来判断目标寄存器的第N位是否为0
3.TEQ 目标寄存器,第二操作数 解释:判断目标寄存器的值是否和第二操作数相等 注意:TEq只能影响CPSR寄存器的z,无法影响c和v位
7.跳转指令
1.b 标签 解释:跳转到指定的标签下,跳转后LR寄存器不保存程序返回地址
2.bl 标签 解释:跳转到指定的标签下,跳转后LR寄存器保存程序返回地址
8.内存读写指令
写:
1.str 目标寄存器,[目标地址] 解释:将目标寄存器中四字节数据写入到目标地址对应的内存中
2.strh 目标寄存器,[目标地址] 解释:将目标寄存器中2字节数据写入到目标地址对应的内存中
3.strb 目标寄存器,[目标地址] 解释:将目标寄存器中1字节数据写入到目标地址对应的内存中
读:
1.ldr 目标寄存器,[目标地址] 解释:从目标地址对应的内存中读取4字节数据保存到目标寄存器中
2.ldrh 目标寄存器,[目标地址] 解释:从目标地址对应的内存中读取2字节数据保存到目标寄存器中
3.ldrb 目标寄存器,[目标地址] 解释:从目标地址对应的内存中读取1字节数据保存到目标寄存器中
9.批量内存读写
写:
stm 基地址,{寄存器列表} 解释:将寄存器列表中所有寄存器的数据都写入到基地址为首地址的内存中
读:
ldm 基地址,{寄存器列表} 解释:从基地址开始往下读取数据,保存到寄存器列表中的每一个寄存器中
补充: 1.寄存器列表德写法: 起始寄存器-终止寄存器 R1-R5 寄存器1,寄存器2.。。 r1,r2,r3,r4,r5 r1-r3,r4,r5 2.无论寄存器列表编号是不是顺序的,内存读写时始终是小编号寄存器对应低地址