通常,cpu 會先將內(nèi)存中的數(shù)據(jù)存儲到寄存器中,然后在對寄存器中的數(shù)據(jù)進(jìn)行運(yùn)算卸勺。
假設(shè)內(nèi)存中有快紅色內(nèi)存空間的值是3,現(xiàn)在想把它的值加1烫扼,并將結(jié)果存儲到藍(lán)色的內(nèi)存空間
- cpu 首先會將紅色內(nèi)存空間的值放到 rax 寄存器中:
movq 紅色內(nèi)存空間, %rax
- 然后讓 rax 寄存器與1相加:
addq $0x1 %rax
- 最后將值賦值給內(nèi)存空間:
movq %rax曙求,藍(lán)色內(nèi)存空間
匯編
- 反匯編: Debug -- Debug Workflow -- Always Show Disassembly
- 內(nèi)存視圖: Debug -- Debug Workflow -- View Memery
規(guī)律
內(nèi)存地址格式為:0x4bdc(%rip) 一般是全局變量,全局區(qū)(數(shù)據(jù)段)
內(nèi)存地址格式為:-0x78(%rbp) 一般是局部變量,椢蛴空間
內(nèi)存地址格式為:0x10(%rax) 一般是堆空間
r開頭 x64 64bit:rax
e開頭 x86 32bit:eax
ah:8bit
匯編語言種類
作為iOS開發(fā)工程師静浴,最主要的匯編語言是:AT&T匯編(iOS模擬器)、ARM匯編(ios真機(jī))
- 8086匯編(16bit)
- x86匯編(32bit)
- x64匯編(64bit)
- ARM匯編(嵌入式挤渐、移動設(shè)備)
x86苹享、x64匯編根據(jù)編譯器的不同,有2種書寫格式
- Inter: Windows派系
- AT&T:Unix派系
常見匯編指令
寄存器
有 16個(gè)常用寄存器:
rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15
寄存器的具體用途:
- rax挣菲、rdx 常作為函數(shù)返回值使用
- rdi富稻、rsi掷邦、rdx白胀、rcx、r8抚岗、r9等寄存器常用于存放函數(shù)參數(shù)
- rsp或杠、rbp 用于棧操作
- rip 作為指令指針
存儲著 cpu下一條
要執(zhí)行的指令的地址
一旦 cpu 讀取一條指令,rip會自動指向下一條指令(存儲下一條指令的地址)
x64 向下兼容:ah al 在 eax中宣蔚、這些都在 rax中向抢,下面也如此。
LLDB 常用指令
- thread step-over胚委、next挟鸠、n
- 單步運(yùn)行,把子函數(shù)當(dāng)做整體一步執(zhí)行(源碼級別)
- thread step-in亩冬、step艘希、s
- 單步運(yùn)行,遇到子函數(shù)會進(jìn)入(源碼級別)
- thread step-inst-over硅急、nexti覆享、ni
- 單步運(yùn)行,把子函數(shù)當(dāng)做整體一步執(zhí)行(匯編級別)
- thread step-inst营袜、stepi撒顿、si
- 單步運(yùn)行,遇到子函數(shù)會進(jìn)入(匯編級別)
- thread step-out荚板、finish
- 直接執(zhí)行完當(dāng)前函數(shù)的所有代碼凤壁,返回上一個(gè)函數(shù)(遇到斷點(diǎn)會卡住)