美文网首页iOS逆向
汇编基础知识

汇编基础知识

作者: 一粒咸瓜子 | 来源:发表于2022-06-28 10:09 被阅读0次
    软件/程序的执行过程

    通常,cpu 会先将内存中的数据存储到寄存器中,然后在对寄存器中的数据进行运算。
    假设内存中有快红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色的内存空间

    • cpu 首先会将红色内存空间的值放到 rax 寄存器中: movq 红色内存空间, %rax
    • 然后让 rax 寄存器与1相加: addq $0x1 %rax
    • 最后将值赋值给内存空间:movq %rax,蓝色内存空间

    汇编

    • 反汇编: Debug -- Debug Workflow -- Always Show Disassembly
    • 内存视图: Debug -- Debug Workflow -- View Memery

    规律

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

    r开头 x64 64bit:rax
    e开头 x86 32bit:eax
    ah:8bit

    汇编语言种类

    作为iOS开发工程师,最主要的汇编语言是:AT&T汇编(iOS模拟器)、ARM汇编(ios真机)

    • 8086汇编(16bit)
    • x86汇编(32bit)
    • x64汇编(64bit)
    • ARM汇编(嵌入式、移动设备)

    x86、x64汇编根据编译器的不同,有2种书写格式

    • Inter: Windows派系
    • AT&T:Unix派系

    常见汇编指令

    寄存器

    有 16个常用寄存器:
    rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15

    寄存器的具体用途:

    • rax、rdx 常作为函数返回值使用
    • rdi、rsi、rdx、rcx、r8、r9等寄存器常用于存放函数参数
    • rsp、rbp 用于栈操作
    • rip 作为指令指针
      存储着 cpu 下一条要执行的指令的地址
      一旦 cpu 读取一条指令,rip会自动指向下一条指令(存储下一条指令的地址)

    x64 向下兼容:ah al 在 eax中、这些都在 rax中,下面也如此。


    LLDB 常用指令

    • 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
      • 直接执行完当前函数的所有代码,返回上一个函数(遇到断点会卡住)

    相关文章

      网友评论

        本文标题:汇编基础知识

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