美文网首页
使用汇编调试iOS

使用汇编调试iOS

作者: Zorin | 来源:发表于2021-08-04 15:28 被阅读0次

    一、汇编语言的种类

    • 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

          本文链接:https://www.haomeiwen.com/subject/aizxvltx.html