浅谈汇编
创建编写汇编文件:
首先创建一个空文件
命名方式以.s结尾
第一行需要声明一个代码段 .text
第二行声明一个global + 方法名 .global test
指令:
汇编代码注释在行前加上 ;
- ret:返回
- mov指令:目的寄存器,源操作数 举例:mov x0, #0x8 将8赋值给x0
- add指令:将两个寄存器相加
- sub指令:将两个寄存器相减
- cmp指令:比较指令 操作数1 操作数2:cmp x0, x1 用x0减去x1,并将结果放到cpsr(程序状态寄存器)寄存器里
- b 指令:跳转指令,相当于jump b 目标地址
- bl指令:带返回的跳转指令,与b指令的区别是使用bl指令,ret指令才会生效
内存操作:
1、load,从内存中装载数据
- ldr指令:从内存中读取数据 ldr x0, [x1]
- ldur指令:,一般如果数据为负数,会用ldur
- ldp指令:从内存中读取数据,放到一对寄存器中 ldp w0, w1, [x2, #0x10]
2、store,往内存中存储数据
- str指令:往内存中写入数据 str w0, [x1],将w0的数据写入到x1中
- stur指令:参考ldur指令
- stp指令:参考ldp指令
- wzr指令:零寄存器
- xzr指令:零寄存器
程序计数器:
- pc(Program Counter)
- 记录CPU当前指令是哪一条指令
- 存储着当前CPU正在执行的指令的地址
- 类似于8086汇编的IP寄存器
堆栈寄存器:
- sp(Stack Pointer)
- fp(Frame Pointer),也就是x29
链接寄存器:
- lr(Link Register),也就是x30
- 存储着函数的返回地址
条件域:
指令的条件码:
- EQ:equal,相等
- NE:not equal,不相等
- GT:great than,大于
- GE:great equal,大于等于
- LT:less than,小于
- LE:less equal,小于等于
CPSR寄存器-状态寄存器