我們先根據一段簡單的C語言去了解arm64彙編
原C程式碼如下:
void __if__(){
int value = 5;
if(value == 3){
printf("333");
} else if (value == 4) {
printf("444");
} else {
printf("else");
}
}
複製程式碼
XCode除錯的反彙編程式碼:
01-彙編-IF-SWITCH`__if__:
0x104b2a898 <+0>: sub sp, sp, #0x20 ; =0x20
0x104b2a89c <+4>: stp x29, x30, [sp, #0x10]
0x104b2a8a0 <+8>: add x29, sp, #0x10 ; =0x10
0x104b2a8a4 <+12>: mov w8, #0x5 // w8 = 5
-> 0x104b2a8a8 <+16>: stur w8, [x29, #-0x4]
0x104b2a8ac <+20>: ldur w8, [x29, #-0x4]
0x104b2a8b0 <+24>: cmp w8, #0x3 ; w8與3進行比較
0x104b2a8b4 <+28>: b.ne 0x104b2a8cc ; 如果 w8 != 3,則跳轉到0x104b2a8cc
0x104b2a8b8 <+32>: adrp x0, 1
0x104b2a8bc <+36>: add x0, x0, #0xf24 ; x0 -> "333"
0x104b2a8c0 <+40>: bl 0x104b2ac0c ; printf("333");
0x104b2a8c4 <+44>: str w0, [sp, #0x8]
0x104b2a8c8 <+48>: b 0x104b2a900 ; <+104> at main.m:22
0x104b2a8cc <+52>: ldur w8, [x29, #-0x4]
0x104b2a8d0 <+56>: cmp w8, #0x4 ; w8與4進行比較
0x104b2a8d4 <+60>: b.ne 0x104b2a8ec ; 如果 w8 != 4,則跳轉到 0x104b2a8ec
0x104b2a8d8 <+64>: adrp x0, 1
0x104b2a8dc <+68>: add x0, x0, #0xf28 ; x0 -> "444"
0x104b2a8e0 <+72>: bl 0x104b2ac0c ; printf("444");
0x104b2a8e4 <+76>: str w0, [sp, #0x4]
0x104b2a8e8 <+80>: b 0x104b2a8fc ; <+100> at main.m
0x104b2a8ec <+84>: adrp x0, 1
0x104b2a8f0 <+88>: add x0, x0, #0xf2c ; x0 -> "else"
0x104b2a8f4 <+92>: bl 0x104b2ac0c ; printf("else");
0x104b2a8f8 <+96>: str w0, [sp]
0x104b2a8fc <+100>: b 0x104b2a900 ; <+104> at main.m:22
0x104b2a900 <+104>: ldp x29, x30, [sp, #0x10]
0x104b2a904 <+108>: add sp, sp, #0x20 ; =0x20
0x104b2a908 <+112>: ret
複製程式碼
用一段簡單的if-else if-else程式碼來介紹,彙編下的if語句的實現流程。
我在每句核心的彙編上加了註釋,參照著C語言程式碼,很容易就能看出整段彙編的流程。【裡面的adrp指令,你們可能會懵逼,你們暫時只需要知道x0->指向的是什麼就好了(程式碼我已經標明瞭),後面我會具體解釋】Xcode下如何檢視反彙編
大夥記得真機除錯哦,不然不是arm64組合語言