ARM汇编指令
EQU #相当于C里面宏定义
例:
COUNT EQU 100;令COUNT的值为100,存储器中为变量分配 0个字节 C:#define EQU 100
COUNT DB 100 ;令COUNT的值为100,存储器中为变量分配 1个字节
COUNT DW 100 ;令COUNT的值为100,存储器中为变量分配 2个字节
其含义:将100 赋值给EQU
LDR加载指令:
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,#8]! ;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。
LDR R0,[R1,R2,LSL#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。”
伪指令:
LDR OP1,OP2
这个是真正的汇编指令
LDR OP1 ,=OP2
这个是伪指令
两个是有区别的
比如LDR R1,UARTLCON0
的意思是将UARTLCON0寄存器的内容存入R1
但是LDR R1,=UARTLCON0
是将UARTLCON0寄存器的地址存入R1
对于第二操作数是立即数的情况
ARM的指令系统的立即数只允许立即数是八位位图数,具体的意识好像是必须是八位二进制数的位移数,因此对于任意的32位二进制数不能直接使用
于是就出现了伪指令LDR R0,=OP2,
这样可以使用任意32位的二进制数
ORR
orr r0,r0,#0xd3
0xd3=1101 0111
含义:将r0与0xd3作算数或运算,然后赋值给r0
STR
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。”
str r1, [r0] ;将r1寄存器的值,传送到地址值为r0的(存储器)内存中
DMB
数据存储器隔离。DMB 指令保证: 仅当所有在它前面的存储器访问操作
都执行完毕后,才提交(commit)在它后面的存储器访问操作。
DSB
数据同步隔离。比 DMB 严格: 仅当所有在它前面的存储器访问操作
都执行完毕后,才执行在它后面的指令
ISB
指令同步隔离。最严格:它会清洗流水线,以保证所有它前面的指令都执
行完毕之后,才执行它后面的指令。
MOV
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
AND
and al,00111011B
就是将al和00111011相与再赋值给al
al = al & 00111011;
ADD
ADD A,B //A=A+B;
功能: 两数相加
ANDS
arm汇编的一般规则就是末尾的s代表是否影响标志位,也就是说AND执行完不会更新cpsr中的标志位,而ANDS就会。
操作一样的。
CLZ
计算前导零的数目
1CLZ {cond} Rd, Rm
Rd 结果寄存器,不允许是R15
Rm 操作数寄存器。CLZ对Rm中的前导零的个数进行计数,结果放在Rd中,若Rm全为0,则结果为32
若位[31]是1,则结果为0
计算二进制数之前零的个数放到Rd中
LSL
R2, LSL #3就是R2左移3位
ORR
orr r0,r0,#0xd3
0xd3=1101 0111
将r0与0xd3作算数或运算,然后将结果返还给r0,
SUBS
sub ax,9 给ax减9,之后的结果赋值给ax
sub ax,bx 语意是ax = bx - ax
S是更新标志位
BGE
BGE就是大于或等于才跳。
BFC
位段清零
BIC:
BIC―――――位清除指令
指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。
指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
bic r0,r0,#0x1f
0x1f=11111b
其含义:清除r0的bit[4:0]位。