真机和模拟器上的 汇编指令是不一样的
1. 寄存器
1.1 寄存器介绍
- 通用寄存器:
- 64bit的:x0 ~ x28
- 32bit : w0 ~ w28(属于x0 ~ x28的低32bit)
- x0-x7通常用来拿来存放函数的参数,更多的是参数使用堆栈来传递
- x0通常拿来存放函数的返回值
- 程序寄存器: pc(program Counter)
- 堆栈指针寄存器:sp(Stack Pointer)、fp(Frame Pointer)
- 链接寄存器:lr(Link Register), 也就是x30
- 程序状态寄存器:
- cpsr:(Cuurent Progame Status Register)
- spsr: (Saved Program Status Register)
1.2 一些调试LLDB的相关指令
-
LLDB指令:
memory read: 读取所有寄存器的值memory write 寄存器 值:给某个寄存器写入值po $x0:打印方法调用者x/s $s1: 打印方法名po $x2:打印参数(以此类推, x3,x4也可能是参数)- 如果是非arm64,寄存器就是r0,r1,r2
-
首先我们创建一个Xcode项目,打个断点,然后通过LLDB调试环境来查看汇编语言的寄存器信息:

我们可以读取并修改寄存器的值:
2. 汇编常用指令
2.1 在Xcode中创建汇编文件
- 汇编文件的后缀为
.asm,这里简写成.s文件 - 我们以函数的形式来学习汇编的指令


- 但是当我们编译项目后,报如下错误:

- 分析错误发现是找不到
_test函数,其实我们表面是调用test()函数,但是底层实质是寻找_test()函数 ,所以我们编写汇编代码的时候,需要修改函数名称为_test

当修改问函数名之后,在次编译发现还是报上述那个错误,找不到_test方法,其实如果是直接在方法前面加上_表示私有函数,我们还需要使用.global关键字来声明下函数

2.2 mov、ret
- mov : 赋值
- 指令格式:
mov {条件} {S} 目的寄存器,源操作数 mov指令可完成从另外一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项指令的操作是否影响CPSR中条件标志位的值,当没有S指令不更新CPSR中条件标志位的值- 指令示例:
mov R1, R0:将寄存器R0的值传递到寄存器R1mov PC, R14:将寄存器R14的值传送到PC,常用语子程序返回mov R1, R0, LSL#3:将寄存器R0的值左移3位传送到R1
- 指令格式:
ret:函数返回,将lr(x30)寄存器的值赋值给pc寄存器mov的示例代码如下
// 作用 告诉写的函数放在哪个段,.text:表示函数放在代码段
.text
//表示函数是公开的,可以被被人访问,而函数的实现在下面
.global _test
//函数名称 test . 相当于打个标记
_test:
mov x0, #0x8 // 把立即数8储存到寄存器x0中
mov x1, x0 //把寄存器x0的值传到寄存器x1中
ret

2.3 add
add: 加法- 指令格式:
add {条件} {S}目的寄存器,操作数1,操作数2 add指令用于把两个数相加,并将结果存放到目的寄存器中,操作数据1,应该是一个寄存器,操作数2也可以是一个寄存器,被移位的寄存器,或一个立即数- 指令示例:
add R0, R1, R2: R0 = R1 + R2add R0, R1, #256: R0 = R1 + 256add R0, R2, R3, LSL#1: R0 = R2 + (R3 << 1)
- 指令格式:
- add的示例代码
.text
.global _add
;add指令
_add:
mov x0, #0x1
mov x1, #0x2
add x0, x0, x1
ret

2.3 sub
sub:减法- 指令格式:
sub {条件} {S}目的寄存器,操作数1,操作数2 sub指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存区,操作数2可以是一个寄存器,被移位的寄存器,或是一个立即数。该指令可用于有符号或无符号数的减法运算- 指令示例:
add R0, R1, R2: R0 = R1 - R2add R0, R1, #256: R0 = R1 - 256add R0, R2, R3, LSL#1: R0 = R2 - (R3 << 1
- 指令格式:
- sub代码示例
.text
.global _sub
;sub指令
_sub:
sub x0, x0, x1

本文详细解析了ARM64汇编的寄存器结构、LLDB调试指令,涵盖了mov、ret、add、sub、cmp等基础指令,以及内存操作的load/store、pc/lr和堆栈处理。实战部分涉及破解Mac/iPhone程序,教你如何利用汇编进行内存修改和函数调试。
最低0.47元/天 解锁文章
909

被折叠的 条评论
为什么被折叠?



