arm64汇编
阅读数:159 评论数:0
跳转到新版页面分类
Linux
正文
一、简介
1、基本格式
指令 执行条件 S 目标寄存器 第一个操作数的寄存器 第二个操作数
(1)S
是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响。
ARM是典型的RISC处理器。
2、寻址方式
(1)立即数寻址
立即数前面有#号,并且如果是十六进制数则在#后添加 0x与&,二进制数#后面加%。
mov r0,#255
(2)寄存器间接寻址
以寄存器中的值作为操作数的地址,而操作数本身放在存储器中。
例如:ADD R0,R1,[R2]
(3)基址变址寻址
将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
例如:LDR R0,[R1,#4] ; R0<-[R1+4]
(4)多寄存器寻址
一条指令可以完成多个寄存器值得传递,一条指令传送最多16个通用寄存器的值。
LDMIA R0,{R1,R2,R3,R4} ;将R1,R2,R3,R4中的数据依次放入R0指向的内存地址
(5)相对寻址
以程序计数器PC的值作为基地址,指令中的地址标号作为偏移量,将两者相加后得到的操作数的有效地址。
例如:BL NEXT;
(6)堆栈寻址
二、b跳转、bl跳转
1、b跳转
b 跳转指令,相当于win32汇编的jmp无条件跳转指令
下面代码遇到 label4以后就跳转到label4,然后就返回了
_fn2:
mov x0,#0x1
mov x1,#0x2
b label4
label3:
mov x0 ,1
ret
label4:
mov x0 , 0
ret;执行完这局以后就返回上一层了
2、bl跳转
bl指令跳转以后遇到第一个ret,就会返回到bl的下一条指令继续执行
同样这段代码把b换成bl就会遇到执行完label4以后遇到ret,还会跳到b label4的下一条指令label3:处继续执行,知道遇到ret才会返回
_fn2:
mov x0,#0x1
mov x1,#0x2
bl label4 ;跳转到label4以后遇到ret后会返回执行下面的label3:
label3:
mov x0 ,1
ret
label4:
mov x0 , 0
ret ;执行完这句以后会跳到label3:
3、b指令可以接上后缀,用来和cmp比较后待条件的跳转
EQ:equal 相等
NE:not equal,不相等
GT:great than,大于
GE greate equal,大于等于
LT:less than,小于
LE:less equal,.小于等于
使用的时候可以连着使用beq 就是 前面cmp比较结果相等的时候跳转.也可以写成b.eq
下面代码距离b.lt小于的时候跳转
_fn1:
mov x0,#0x1 ;立即数以#井号开头,0x是16进制
mov x1,#0x2
cmp x0,x1 ;这里做比较,用来下面的b跳转做比较条件
b.lt label2 //lt小于时候跳转,上面cmp 比较练x0和x1,x0<x1成立,所以 b.lt会跳转
label1:
mov x0 ,1
label2:
mov x0 , 0
ret
三、ARM伪指令
ARM 伪指令不是ARM 指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其它ARM 指令一样使用,但在编译时这些指令将被等效的ARM 指令代替。ARM伪指令有四条,分别为ADR 伪指令、ADRL 伪指令、LDR 伪指令和NOP 伪指令。
1、ADR
将基于PC相对偏移的地址值读取到寄存器中。
ADR R2, LOOP ;将LOOP 的地址放入R2
2、ADRL
将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器,比ADR可以读取更大范围的地址。
3、LDR
用于加载32位的立即数或一个地址值到指定寄存器。
LDR R0,=0x123456 ;加载32 位立即数0x12345678
LDR R0,=DATA_BUF+60 ;加载DATA_BUF 地址+60
4、nop
空操作。
四、存储器访问指令
1、LDR和STR
加载/存储字和无符号字节指令。LDR指令用于从内存读取数据放入寄存器中,STR指令用于将寄存器中的数据保存到内存。
2、LDM和STM
批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。LDM为加载多个寄存器,STM为存储多个寄存器。
3、SWP
寄存器和存储器交换指令。
五、ARM数据处理指令
大致分为三类:
1、数据传输指令
(1)MOV
把立即数或寄存器传送到目标寄存器。
(2)MVN
将立即数或寄存器按位取反后传输到目标寄存器。
2、算术逻辑运算指令
(1)ADD
加法指令
(2)SUB
减法指令
(3)RSB
逆向减法指令,操作数二减操作数一。
(4)ADC
带进位加法指令。
(5)SBC
带进位减法指令。
(6)RSC
带进位逆向减法指令。
(7)AND
逻辑与操作指令。
(8)ORR
逻辑或操作指令
orr{cond} dest,op1,op2
; dest=op1 | op2
orr r0,r0,#3 ; 设置r0中位0和1,其余位保持不变
(9)EOR
逻辑异或操作指令。
(10)BIC
位清除指令。
3、比较指令
(1)CMP
比较指令,操作数一减去操作数二的值,根据CSR中相应条件标志位。
(2)CMN
负数比较指令。
(3)TST
位测试指令。操作数一的值与操作数二的值按位逻辑与操作。
(4)TEQ
相等测试指令。操作数一的值与操作数二的值按位异或操作。
4、乘法指令
(1)MUL
32位乘法指令。
(2)MLA
32位乘加指令。
(3)UMULL
64位无符号乘法指令。
(4)UMLAL
64位乘加指令。
(5)SMULL
64位有符号乘法指令。
(6)SMLAL
64位乘加指令。
六、ARM协处理器指令
1、CDP
协处理器数据操作指令。
2、LDC
LDC指令从某一连续的内存单元将数据读取到协处理器的寄存器中。
3、STC
STC指令将协处理器的寄存器数据写入到某一连续的内存单元中。
4、MCR
ARM寄存器到协处理器寄存器的数据传送指令。
5、MRC
协处理器寄存器到ARM寄存器到的数据传送指令。
七、杂项指令
1、SWI
软中断指令。
2、MRS
Move the contents of a PSR to a general-purpose register,即把PSR的寄存器值,搬运到通用寄存器中。
mrs{cond} Rd,psr
3、MSR
msr{cond} psr,Rd
把通用寄存器值搬运到psr寄存器中。