1. ldr/str内存访问
ldr ,x0,[x8,#4] 把x8+4指向的内存加载到x0
str ,x0,[x8,#8] 把x0指向的内存存储到x8+8地址上.
2. mov指令
mov r0,r1 //r1值赋值给r0
mov r0,r1 ,lsl #3 //
3.加减指令
add x0,x1,x2 // x0 = x1 + x2
sub x0,x1,x2 //x0 = x1-x2
4.比较指令
cmp x0,x1 //比较指令,相等EQ,否则NQ
tst x0, 0x01 //测试指令,判度x0最低位是否为0,tst是作与(&)操作,结果为0,EQ生效,否则NQ
teq r0, r1 //判断r0是否等于r1, 等于EQ生效,否则NQ
这三个指令,都影响CPSR的状态位(Z)
5. 跳转指令
bne addr1 //cmp不相等时,跳转
beq addr2 //cmp相等时,跳转
6.逻辑操作
and x0,x0,#0xF // x0= x0&0xF
orr x0,x0,#0xF // x0 = 0x || 0xF
eor x0,x0,#0xF /// 亦或操作
7.入栈/出栈指令
STP x29, x30, [sp, #0x10] ; 入栈指令
LDP x29, x30, [sp, #0x10] ; 出栈指令
8. STM/LDM指令
格式:
LDM{cond} mode Rn{!}, reglist{^} //(load much)多数据加载,将地址上的值加载到寄存器上
STM{cond} mode Rn{!}, reglist{^}//(store much)多数据存储,将寄存器的值存到地址上
其中:
Rn:基址寄存器,装有传送数据的起始地址,Rn不允许为R15;
!:表示最后的地址写回到Rn中;
reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列;
^:不允许在用户模式和系统模式下运行,()
主要用途:现场保护、数据复制、参数传送等,共有8种模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下:
(1)IA:(Increase After) 每次传送后地址加4,其中的寄存器从左到右执行,例如:STMIA R0,{R1,LR} 先存R1,再存LR
(2)IB:(Increase Before)每次传送前地址加4,同上
(3)DA:(Decrease After)每次传送后地址减4,其中的寄存器从右到左执行,例如:STMDA R0,{R1,LR} 先存LR,再存R1
(4)DB:(Decrease Before)每次传送前地址减4,同上
(5)FD: 满递减堆栈 (每次传送前地址减4)
(6)FA: 满递增堆栈 (每次传送后地址减4)
(7)ED: 空递减堆栈 (每次传送前地址加4)
(8)EA: 空递增堆栈 (每次传送后地址加4)
注意:其中在数据块的传输中是STMDB和LDMIA对应,STMIA和LDMDB对应
而在堆栈操作是STMFD和LDMFD对应,STMFA和LDMFA对应
LDMIA R0! ,{R3-R9} ;加R0指向的地址上连续空间的数据,保存到R3-R9当中,!表示R0值更新
STMIA R1!,{R3-R9} ;将R3-R9的数据存储到R1指向的地址上,R1值更新
ldmia sp, {r0 - pc}^ : 把堆栈内容恢复到ro- pc寄存器. "^" 表示把SPSR赋值给CPSR寄存器
9. MRS和MSR指令
MRS: 状态寄存器到通用寄存器的传送指令。
mrs r0 cpsr //r0 = cpsr
MSR: 通用寄存器到状态寄存器的传送指令
msr cpsr r0 //cprs = r0
10 push和pop指令
push 和pop时ARMv8的入栈宏定义指令,用stp/ldp实现
push x0,x1 //入栈
pop x0,x1 //出栈
11.CBZ 和 CBNZ
比较,为零则跳转;比较,为非零则跳转。
语法
CBZ Rn, label
CBNZ Rn, label