ARM64汇编
2021-05-26 本文已影响0人
LucXion
不同架构的汇编代码是不同的,这里研究的是真机ARM64架构的汇编
- 通用寄存器
可以通过$register read
命令查看,ARM64架构下有29个寄存器:x0-x28(64bit),隐藏的寄存器有w0-w28(属于x0-x28的低32bit)。
写入寄存器$register write cpsr 0
- 程序计数器
pc (program count)
- 堆栈指针
sp(Stack Pointer)
Fp(Frame Pointer),x29
- 链接寄存器
lr(Link Register),x30
- 程序状态寄存器
cpsr : current project status register
spsr : saved peoject status register 异常状态下使用
如何在xcode中编写汇编代码
- 在xcode中新建.s后缀文件

-
同时创建一个同名的.h头文件与之对应
-
在.h中暴露方法,在.s中编写代码
<.h>
#ifndef Test_h
#define Test_h
void test (void);// 对外声明
#endif /* Test_h */
<.s>
.text // 文件写入text代码段
.global _test // 对外声明函数,因为汇编已经是底层了,要自己手动加下划线
_test:
mov x1 ,8
ret // 以ret 结尾,否则会穿透
mov、add、sub 指令
_test:
mov w1,#0x5 // w1 = 5
mov w2,#0x7 // w2 = 7
add w1 ,w1 ,w2 // w1 = w1 + w2
sub w3 , w1, 3 // w3 = w1 - 3
ret // 以ret 结尾,否则会穿透
cmp指令cmp w1,w2
: 将w1 - w2 的结果放到状态寄存器cpsr,cpsr不直接保存结果,结果会影响cpsr不同的位值

_test:
;b指令 // ;也有注释的意思
mov w1,#0x5
mov w2,#0x5
cmp w1, w2 // b指令需要和cmp配合使用,会到状态寄存器内检查条件是否满足
beq jump // 跳转到 jump私有方法
mov w3, 3
ret
jump: // jump实现
mov w1, 1
ret
b指令

bl指令
_test:
;bl指令
bl jump // bl指令跳转到 jump后会返回并执行下面的代码
mov w3, 3 // 如果用的是b指令,如果满足条件跳转出去后不会再返回执行下面代码
ret