使用汇编调试iOS

一、汇编语言的种类

  • 1、8086汇编(16bit)
  • 2、x86汇编(32bit)
  • 3、x64汇编(64bit)
  • 4、ARM汇编(嵌入式,移动设备)
   x86和x64根据编译器的不同,有两种书写格式
   * Intel: Windows派系
   * AT&T: UNIX派系

作为iOS开发常用的汇编语言是
AT&T:iOS模拟器
ARM:iOS真机设备


二、常用汇编指令

项目 AT&T Intel ARM 说明
寄存器命名 %rax rax
操作数顺序 movq %rax,%rdx mov rdx,rax 将rax的值赋值给rdx
常数\立即数 movq $0x10,%rax mov rax,0x10 将0x10赋值给rax
内存赋值 movq $0xa,0x1ff7(%rip) mov qword ptr[rip+0x1ff7],0xa 将0xa赋值给地址为rip+0x1ff7的内存空间
jmp指令 Jmp *%rdx
jmp 0x4001002
jmp *(%rax)
jmp rdx
jmp 0x4001002
jmp [rax]
call和jmp写法类似
操作数长度 movl %eax,%edx
movb $0x10,%al
leaw 0x10(%dx),%ax
mov edx,eax
mov al,0x10
lea ax,[dx+0x10]
看下文
b = byte(8-bit)
s = short(16-bit integer or 32-bit floating point)
w = word(16-bit)
l = long(32-bit integer or 64-bit floating point)
q = quad(64 bit)
t = ten bytes(80-bit floating point)
1. 常用寄存器
  • 有16个常用寄存器
rax、rbx、rcx、rdx、rax、rsi、rdi、rbp、rsp、rip
r8、r9、r10、r11、r12、r13、r14、r5、
  • 寄存器的具体用途
    rax、rdx 常作为函数返回值使用
    rcx、rdx、rsi、rdi、r8、r9 常用于存放函数参数
    rbp、rsp 常用于栈操作
    rip 作为指令指针
    rip 存储着CPU下一条要执行的指令的地址
    一旦CPU读取一条指令,rip会自动指向下一条指令(存储下一条指令的地址)

三、lldb常用指令

  1. 寄存器
  • 读取寄存器的值
register read/格式
register read/x
  • 修改寄存器的值
register write 寄存器名称 数值
register write rax 0
  1. 内存
  • 读取内存中的值
x/数量-格式-字节大小 内存地址
x/3xw ox00000010
  • 修改内存中的值
memory write 内存地址 数值
memory write 0x00000010 10
  1. 打印
  • po 表达式
po/x $rax
po (int)$rax
  • print 表达式
  1. 数据和格式
  • 格式
x是16进制,f是浮点,d是十进制
  • 字节大小
b - byte 1字节
h - half word 2字节
w - word 4字节
g - giant word 8字节
  • 调试指令
thread step-over、next、n
单步运行,把子函数单做整体一步执行(源码级别)

thread step-in、step、s
单步运行,遇到子函数会进入子函数(源码级别)

thread step-inst-over、nexti、ni
单步运行,把子函数当做一个整体一步执行(汇编级别)

thread step-inst、stepi、si
单步运行,遇到子函数会进入子函数(汇编级别)

thread step-out、finish
直接执行完当前函数的所有代码,返回到上一个函数(遇到断点会卡住)
  • 调试经验

内存地址格式为:0x4bdc(%rip),一般是全局变量,全局区(数据段)
内存地址格式为:-0x78(%rbp),一般是局部变量,栈空间
内存地址格式为:0x10(%rax),一般是堆空间


  1. 存储在硬盘中的一段程序
  2. 程序被加载到内存中
  3. cpu 对加载在内存中的程序进行读,运算以及写操作

你可能感兴趣的:(使用汇编调试iOS)