汇编基础知识

软件/程序的执行过程

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

你可能感兴趣的:(汇编基础知识)