Swift語(yǔ)法 Swift5 【00 - 匯編】


  • 作者: Liwx
  • 郵箱: 1032282633@qq.com
  • 源碼: 需要源碼的同學(xué), 可以在評(píng)論區(qū)留下您的郵箱

iOS Swift 語(yǔ)法 底層原理內(nèi)存管理分析 專題:【iOS Swift5語(yǔ)法】

00 - 匯編
01 - 基礎(chǔ)語(yǔ)法
02 - 流程控制
03 - 函數(shù)
04 - 枚舉
05 - 可選項(xiàng)
06 - 結(jié)構(gòu)體和類
07 - 閉包
08 - 屬性
09 - 方法
10 - 下標(biāo)
11 - 繼承
12 - 初始化器init
13 - 可選項(xiàng)


目錄

  • 01-程序的本質(zhì)
    • 01-軟件/程序執(zhí)行過(guò)程
  • 02-寄存器和內(nèi)存
  • 03-編程語(yǔ)言的發(fā)展
  • 04-編程語(yǔ)言的發(fā)展
  • 05-匯編語(yǔ)言的種類
  • 06-常用匯編指令
  • 07-寄存器
  • 08-寄存器兼容
  • 09-lldb常用指令
  • 10-lldb常用指令(斷點(diǎn)調(diào)試)
  • 11-規(guī)律

01-程序的本質(zhì)

Xcode調(diào)試中顯示匯編代碼Debug -> Debug Workflow -> Always Show Disassembly


01-軟件/程序執(zhí)行過(guò)程

  • 程序運(yùn)行時(shí),
    程序/軟件是存儲(chǔ)在硬盤中,當(dāng)程序開(kāi)始執(zhí)行是,從硬盤裝載內(nèi)存,CPU再對(duì)內(nèi)存進(jìn)行讀寫,并控制
    ,話筒等其他設(shè)備.
  • CPU中包含幾個(gè)部分,其中包含寄存器(信息存儲(chǔ)),運(yùn)算器(信息處理),控制器.

02-寄存器和內(nèi)存

  • 通常CPU會(huì)先將內(nèi)存中的數(shù)據(jù)存儲(chǔ)到寄存器中,然后再對(duì)寄存器的數(shù)據(jù)進(jìn)行運(yùn)算
  • 假設(shè)內(nèi)存中有塊內(nèi)存空間1的值是3,現(xiàn)在想將它的值加1,并將結(jié)果存儲(chǔ)到內(nèi)存空間2
  • CPU首先會(huì)將內(nèi)存空間1的值放到rax寄存器中: movq 內(nèi)存空間1 %rax
  • 然后讓rax寄存器與1相加: addq $0x1 %rax
  • 最后將值賦值給內(nèi)存空間2: movq %rax 內(nèi)存空間2

03-編程語(yǔ)言的發(fā)展

  • 機(jī)器語(yǔ)言
  • 01組成
  • 匯編語(yǔ)言
  • 符號(hào)代替了0和1,比機(jī)器語(yǔ)言更便于閱讀和記憶
  • 高級(jí)語(yǔ)言
  • C/C++/Java/JavaScript/Python等,更接近人類自然語(yǔ)言
  • 操作: 將寄存器BX內(nèi)容送入寄存器AX
  • 機(jī)器語(yǔ)言: 1000100111011000
  • 匯編語(yǔ)言: movw %bx %ax
  • 高級(jí)語(yǔ)言: ax = bx

04-編程語(yǔ)言的發(fā)展

  • 高級(jí)語(yǔ)言 編譯-> 匯編語(yǔ)言 編譯-> 機(jī)器語(yǔ)言 運(yùn)行-> 計(jì)算機(jī)
  • 反編譯: 機(jī)器語(yǔ)言 反編譯-> 匯編語(yǔ)言
  • 匯編語(yǔ)言與機(jī)器語(yǔ)言一對(duì)應(yīng) ,每一條機(jī)器指令都有與之對(duì)應(yīng)的匯編指令
  • 匯編語(yǔ)言可以通過(guò)編譯得到機(jī)器語(yǔ)言,機(jī)器語(yǔ)言可以通過(guò)反匯編得到匯編語(yǔ)言
  • 高級(jí)語(yǔ)言可以通過(guò)編譯得到匯編語(yǔ)言\機(jī)器語(yǔ)言,但匯編語(yǔ)言機(jī)器語(yǔ)言幾乎不可能還原成高級(jí)語(yǔ)言

05-匯編語(yǔ)言的種類

  • 匯編語(yǔ)言的種類
  • 8086匯編(16bit)
  • x86匯編(32bit)
  • x64匯編(64bit)
  • ARM匯編(嵌入式、移動(dòng)設(shè)備)
  • ......
  • x86、x64匯編根據(jù)編譯器的不同,有2種書寫格式
  • Intel: Windows派系
  • AT&T : Unix派系.
  • 作為iOS開(kāi)發(fā)工程師,最主要的匯編語(yǔ)言是
  • AT&T匯編-> iOS模擬器
  • ARM匯編-> iOS真機(jī)設(shè)備

06-常用匯編指令

注意: 小括號(hào)()通常表示存放內(nèi)存地址。

在AT&T指令中 $立即數(shù)的前稱。

項(xiàng)目 AT&T Intel 說(shuō)明
寄存器名稱 %rax rax
操作數(shù)順序 movq %rax, %rdx mov rdx, rax 將rax的值賦值給rdx
常數(shù)/立即數(shù) movq $0x3, %rax mov rax, 0x3 將3賦值給rax
內(nèi)存賦值 movq $0xa, 0x1ff7(%rip) mov qword ptr [rip+0x1ff7], 0xa 將0xa賦值給地址為rip+0x1ff7的內(nèi)存空間
取內(nèi)存地址 leaq -0x18(%rbp), %rax lea rax, [rbp-0x18] 將rbp-0x18這個(gè)地址值賦值給rax
jmp跳轉(zhuǎn)指令 jmp *%rdx 或 jmp 0x4001002 或 jmp *(%rax) jmp rdx 或 jmp 0x4001002 或 je=mp [rax] call和jmp寫法類似
操作數(shù)長(zhǎng)度 movl %eax, %edx 或 movb $0x10, %al 或 leaw 0x10(%dx), %ax mov edx, eax 或 mob al, 0x10 或 lea ax, [dx+0x10] 參考操作數(shù)長(zhǎng)度說(shuō)明
  • 操作數(shù)長(zhǎng)度說(shuō)明
  • b = byte(8-bit)
  • s = short(16-bit integer or 32-bit floating point)
  • w = word(16-bit)
  • l = long(32-bit integer or 63-bit floating point
  • q = quad(64-bit))
  • t = ten bytes(80-bit floating point)

07-寄存器

  • 有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作為指令指針
      • 存儲(chǔ)著CPU下一條要執(zhí)行的指令的地址
      • 一旦CPU讀取一條指令, rip會(huì)自動(dòng)指向下一 條指令(存儲(chǔ)下一條指令的地址)

08-寄存器兼容

為兼容不同位數(shù), 取64位rax寄存器低32位作為eax寄存器使用,低16位作為ax寄存器使用,ah作為高8位使用,al作為低8位使用

  • 寄存器說(shuō)明
  • r開(kāi)頭: 64-bit
  • e開(kāi)頭: 32-bit
  • a, b, c, d開(kāi)頭:16-bit
  • ah, al, bh, bl ... l和h結(jié)尾8-bit,h: 高八位,l: 低八位
image.png

09-lldb常用指令

  • 格式

    • x16進(jìn)制,f浮點(diǎn),d進(jìn)制
  • 字節(jié)大小

    • b - byte 1字節(jié)
    • h - half word 2字節(jié)
    • w - word 4字節(jié)
    • g - giant word 8字節(jié)
  • 讀取寄存器的值
    • register read/格式 寄存器名稱
    • register read/x
// 讀取rax寄存器的值
(lldb) register read rax
    rax = 0x0000000100709e40
// 讀取rax寄存器的值   
(lldb) register read/x rax
    rax = 0x0000000100709e40  
// 讀取所有寄存器的值 
 (lldb) register read
General Purpose Registers:
      rax = 0x0000000100709e40
      rbx = 0x0000000000000000
      rcx = 0x00007fff81c908f8  libswiftCore.dylib`type metadata for Swift.Int
      rdx = 0x0000000100709e60
      rdi = 0x0000000100709e48
      rsi = 0x00007fff81c96588  libswiftCore.dylib`type metadata for Any + 8
      rbp = 0x00007ffeefbff4d0
      rsp = 0x00007ffeefbff4b0
       r8 = 0x00000000000005dd
       r9 = 0x00000000000005e2
      r10 = 0x00000000fffffffc
      r11 = 0x0000000000000000
      r12 = 0x0000000000000000
      r13 = 0x0000000000000000
      r14 = 0x0000000000000000
      r15 = 0x0000000000000000
      rip = 0x0000000100000bd2  00-匯編`_0_匯編.test() -> () + 50 at main.swift:13:14
   rflags = 0x0000000000000206
       cs = 0x000000000000002b
       fs = 0x0000000000000000
       gs = 0x0000000000000000  
  • 讀取內(nèi)存中的值
    • x/數(shù)量-格式-字節(jié)大小 內(nèi)存地址
    • x/3gw 0x0000010
(lldb) x/3xg 0x00007fff81c908f8
0x7fff81c908f8: 0x0000000000000200 0x00007fff683e58ec
0x7fff81c90908: 0x0000000000000000
  • 修改內(nèi)存中的值
    • memory write 內(nèi)存地址 數(shù)值
    • memory write 0x0000010 10
lldb) memory write 0x00007fff81c908f8 0x10
(lldb) x/xg 0x00007fff81c908f8
0x7fff81c908f8: 0x0000000000000210
(lldb) memory write 0x00007fff81c908f8 0x20
(lldb) x/xg 0x00007fff81c908f8
0x7fff81c908f8: 0x0000000000000220
  • expression 表達(dá)式

    • 可以簡(jiǎn)寫: expr高級(jí)語(yǔ)言表達(dá)式
    • expression $rax // 驗(yàn)證不通過(guò)
    • expression $rax = 1 // 驗(yàn)證不通過(guò)
    • expr unsigned int $foo = 5
  • po 表達(dá)式

    • print 表達(dá)式
    • po/x $rax // 驗(yàn)證不通過(guò)
    • po (int)$rax // 驗(yàn)證不通過(guò)

10-lldb常用指令(斷點(diǎn)調(diào)試)

  • thread step-over、 next、 n
    • 單步運(yùn)行,把子函數(shù)當(dāng)做整體-步執(zhí)行(源碼級(jí)別)
  • thread step-in、step、 s
    • 單步運(yùn)行,遇到子函數(shù)會(huì)進(jìn)入子函數(shù)(源碼級(jí)別)
  • thread step inst over、 nexti、 ni
    • 單步運(yùn)行,把子函數(shù)當(dāng)做整體-步執(zhí)行 (匯編級(jí)別)
  • thread step-inst、 stepi、 si
    • 單步運(yùn)行,遇到子函數(shù)會(huì)進(jìn)入子函數(shù)(匯編級(jí)別)
  • thread step-out、 finish
    • 直接執(zhí)行完當(dāng)前函數(shù)的所有代碼,返回到上一個(gè)函數(shù)(遇到斷點(diǎn)會(huì)卡住)

11-規(guī)律

  • 內(nèi)存地址格式為: 0x4bdc(%rip) ,一般是全局變量 ,全局區(qū)(數(shù)據(jù)段)
  • 內(nèi)存地址格式為: -0x78(%rbp) , 一般是局部變量,??臻g
  • 內(nèi)存地址格式為: 0x10(%rax) , 一般是堆空間

iOS Swift 語(yǔ)法 底層原理內(nèi)存管理分析 專題:【iOS Swift5語(yǔ)法】

下一篇: 01 - 基礎(chǔ)語(yǔ)法


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容