汇编语言
1. 汇编语言的组成
汇编文件中由伪操作、伪指令、汇编指令以及代码注释这几部分组成
伪操作:
ARM的汇编中伪操作以.为前缀,所有的伪操作不占用内存空间,编译汇编时告诉编译器怎么编译当前文件,主要用来修改汇编内容的 .text .global .globl .end .if .else .endif
伪指令:不是指令,但是伪指令也会占用指令内存,执行一条伪指令时也会让运算器进行相关运算
汇编指令:汇编指令执行时会让运算器进行相关运算
数据处理指令
跳转指令
内存读写指令
状态寄存器传送指令
异常触发指令
协处理器指令(不讲)
注释:
单行注释:@
多行注释:/* */
条件注释:
.if 逻辑值
指令段
.else
指令段
.endif
解释:逻辑值为真,则执行上一段指令,逻辑值为假,则执行else下面的指令段
2.汇编指令格式
<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
opcode:汇编指令的指令码
code 条件码
s:当按照指令码对应的指令执行时程序的运行结果会影响到CPSR的条件位
RD:目标寄存器,指令运算的结果保存至目标寄存器中
RN:第一操作寄存器 参与运算的寄存器
shifter_operand:第二操作数 参与运算的数据,可以是寄存器,也可以是一个立即数
操作数前面需要加一个#
将第一操作寄存器的数值和第二操作数按照指令码进行运算,如果指令码后面有s后缀,运算的结果会影响CPSR条件位,指令的运行结果保存至目标寄存器中
3. 汇编指令---数据处理指令
3.1 数据搬移指令
功能:能够将指定的数值搬移到指定的寄存器中
mov{条件码} 目标寄存器,操作数
如果条件码对应的条件满足,则将操作数的值存放到目标寄存器,这个操作数既可以是立即数,也可以是寄存器
mvn{条件码} 目标寄存器,操作数
如果条件码对应的条件满足,则将操作数的值按位取反后存放到目标寄存器,这个操作数既可以是立即数,也可以是寄存器
3.2 立即数
立即数指的是可以直接当作指令的一部分去执行的数据。32位的指令空间中为操作数预留了12位的空间,12位空间分为两部分:低八位和高四位,从0-255范围内找一个数字,让这个数字循环右移偶数位,能够得到的数据就是立即数,否则就不是立即数
3.3 数据移位指令
算术左移:最高位移出,最低位补0
lsl{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值算术左移第二操作数对应的数值位数,结果保存到目标寄存器中
算术右移:最低位移出,最高位补0
lsr{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值算术右移第二操作数对应的数值位数,结果保存到目标寄存器中
循环右移:最低位移出,补到最高位
ror{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值循环右移第二操作数对应的数值位数,结果保存到目标寄存器中
3.4 位运算指令
按位与:
and{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值和第二操作数进行与运算,运算的结果保存到目标寄存器中
按位或:
orr{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值和第二操作数进行或运算,运算的结果保存到目标寄存器中
按位异或:
eor{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值和第二操作数进行异或运算,运算的结果保存到目标寄存器中
按位取反:
mvn{条件码} 目标寄存器,操作数按位清零
BIC{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数
将第一操作寄存器的数值和第二操作数进行按位清零运算,运算的结果保存到目标寄存器中
3.5 算术运算指令
加法指令:
add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数
adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数+cpsr寄存器c位的值
减法运算:
sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器-第二操作数
sbc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的取反值
逆向减法运算:
rsb{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第二操作数-第一操作寄存器
rsc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第二操作数-第一操作寄存器-cpsr寄存器c位的取反值乘法运算:
mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数 @目标寄存器=第一操作寄存器+第二操作数
3.6 数据比较指令
cmp 第一操作寄存器,第二操作数
比较指令的本质就是两个比较的数3进行减法运算,而且运算的结果会影响到CPSR条件位我们在比较指令执行完毕后其他的指令后面可以跟上指定的条件码,当该指令执行之前,先去判断条件码对应的条件是否满足,如果满足,则该指令执行,如果不满足,则该指令不执行