arm64汇编

阅读数:109 评论数: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寄存器中。

 




相关推荐

在bootloader的帮助下,内核被载入到内存中,内核映像被加载到内存并获得控制权之后,内核启动流程开始。通常,内核映像以压缩形式存储,并不是一个可以执行的内核。因此内核的首要工作是自解压内核

在Unix和x86-64 Linux上,ELF(Executable and Linkable Format),ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Secti

重点:linux内核中的汇编基于AT&T的语法。 一、简介 Linux内核中包含的汇编源码主要由两部分组成:一大部分是内核arch目录和其它目录下的纯汇编文件,以.S为后缀的文件;另一小部分是嵌入在C

一、通过源安装 # 安装arm-linux-gcc sudo apt-get install gcc-arm-linux-gnueabihf # 安装arm-linux-g++ sudo apt-ge