ARM64汇编 - wanshanhu79/Study GitHub Wiki
- 真机:ARM64汇编
- 寄存器
- 指令
- 堆栈
- 模拟器:x86汇编
-
通用寄存器
- 64bit的:x0~x63
- 32bit的:w0
w31(属于x0x31的低32bit)- register:寄存器的意思
- register read x0:读
- register write x0 0x1000000000000001:写
- register read :看所有的寄存器
- x0 ~ x7 通常拿来存放函数的参数,更多的参数使用堆栈来传递
- x0通常拿来存放函数的返回值
-
程序计数器
- pc (Program Counter)
- 记录CPU当前指令的那一条指令
- 存储着当前CPU正在执行的指令的指令
- 类似以8086汇编的ip寄存器
-
堆栈指针
- sp(Stack Pointer),栈顶指针
- fp(Frame Pointer),函数调用栈的栈底指针
-
链接寄存器
- lr(Link Register),也就是x30
- 存储着函数的返回地址,bl指令在跳转前,将下一步要执行的指令地址放在lr中
-
程序状态寄存器
-
cpsr(Current Program Status Register)
-
spsr(Saved Programe Status Register),异常状态下使用
-
在OC或c语言代码中直接插入汇编代码
__asm({
})
建立.s汇编文件(.asm的简写)
arm.h 文件
void test(); ///函数的声明,方便外部调用
arm.s 文件
.text ;告诉编译器代码放哪儿
.global _test, _add;函数的实现默认是私有的,加这个表示是公开的
///函数名称实现
_test: ;c语言函数编译后,函数名前会自动加_, C语言函数名与汇编中加下划线的标记对应
mov x0 #0x8 ;将8存入x0寄存器中
; /// 汇编中的注释
mov x0, #0x1
mov x1, #0x2
add x2, x0, x1 ;将x0和x1相加赋值给x2
mov x0, #0x5
mov x1, #0x2
sub x2, x0, x1 ;将x0减x1赋值给x2
mov x0, #0x5
mov x1, #0x2
cmp x0, x1 ;x0减x1,减去的结果放cpsr寄存器
b mycode
mov x0, #0x5
mycode:
mov x1, #0x2
mov x0, #0x5
mov x1, #0x2
cmp x0, x1
beq mycode
mov x0, #0x5
ret ;不返回会一直往下执行
mycode:
mov x1, #0x2
ldr x0 [x1];把寄存器x1中内存地址的中存放的数据复制到寄存器x0
ldr x0 [x1, #0x6]; 寄存器x1中内存地址偏移0x6
ldr w0, w1 [x2, #0x10]; 从x2+0x20 取相应字节的内存数据到w0寄存器,再顺序取后面的到w1寄存器
str x0 [x1]; 把寄存器x0的数据写入到寄存器x1中内存地址,x0不能用立即数替代,因为立即数没有字节长度
stp x29, x30, [sp, #-16]!; // 把 x29, x30的值存到 sp-16的地址上,并且把 sp-=16.
str x5, [sp, #24]; // 把x5的值(64位数值)存到 sp+24 指向的内存地址上
ret ;返回,没有返回,会一直执行,直到ret
#0x2 这样的直接明确的数字就是立即数
-
ret
- 函数返回
-
mov
- mov 目的寄存器, 源操作数
-
add
-
sub
-
cmp
- 将2个寄存器相减
- 相减的结果回影响cpsr寄存器的标志位
-
b
- 跳转指令
- 可以带条件跳转,一般跟cmp配合使用
-
bl
- 带返回的跳转指令(函数调用)
- 执行的操作
- 将下一条指令的地址存储到**lr(x30)**寄存器中
- 跳转到标记处开始执行
- 标记处的代码执行完,ret指令把lr寄存器中的指令地址写入到pc寄存器中,返回继续执行
-
条件域
- EQ:equal,相等
- NE:not equal,不相等
- GT:greate than,大于
- GE:greate equal,大于等于
- LT:less than, 小于
- LE:less equal,小于等于
-
内存操作
- load,从内存中读取数据 * ldr 立即数是正数 * ldur 立即数是负数 * ldp (p是pair的简称,一对)
- store,往内存中写入数据
- str、stur
- stp
- 零寄存器,里面存储的值是0
- wzr(32bit,Word Zero Register)
- xzr (64bit)
-
函数的类型
-
叶子函数,函数内部有调用其他函数
-
非叶子函数
-
- xcun --sdk iphoneos clang -S -arch arm64 main.c -o main.s
po $x0:打印方法调用者
x/s $x1:打印方法名
po $x2:打印参数
po $x0** :打印寄存器中的值,直接打印寄存器不行,要加上美元符
x/s $x1:寄存器中存储的是字符串,将寄存器中的信息以字符串的格式打印出来