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