我们常用的ARM汇编指令,下面写的cond代表条件码,S代表影响CPSR寄存器,Rd代表目标寄存器,operand代表寄存器的地址或者立即数等等。
(1)分支跳转语句
b{l}{cond} <target>:
①相当于C语言中的goto,跳转范围是±32M。
②若使用bl则会在执行完函数之后跳转回该地址。
(2)数据操作指令
LSL 逻辑左移 ASL 算术左移 LSR 逻辑右移 ASR 算术右移 ROR 循环右移 RRX 带扩展的循环右移
eg:MOV R0, R1, LSL #2 将R1的内容左移两位,然后赋值给R0
顺便补充一下,逻辑,算数,循环移位的区别:
逻辑左移时,最高位丢失,最低位补0;
逻辑右移时,最高位补0,最低位丢失;
算术左移时,依次左移一位,尾部补0,最高的符号位保持不变;
算术右移时,依次右移一位,尾部丢失,符号位右移后,原位置上复制一个符号位;
循环左移时,将最高位重新放置最低位;
循环右移时,将最低位重新放置最高位;
(3)数据传输指令
mov{cond{s} <Rd> <operand>
(4)算数运算指令
add/adc{cond}{s} <Rd>, <Rn>, <operand>
sub/sbc/rsb{cond}{s} <Rd>, <Rn>, <operand>
eg:ADD R0,R1,R2 R0=R1+R2
(5)比较测试指令
cmp{cond} <Rn>, <operand>:比较俩个寄存器的值是否相等
tst{cond} <Rn>, <operand>:测试某个位是否为1
teq{cond} <Rn>, <operand>:测试两个数据是否相等