iOS Hacker Xcode玩转arm64汇编基础
已經(jīng)熟悉了x86匯編,所以其他的理論就不多記了,主要是記錄以下這些。
iphon5s以上都是arm64的設(shè)備
armv6 設(shè)備:iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 設(shè)備:iPhone3GS, iPhone4, iPhone4S
? ? ? ? ? ?iPad, iPad2, iPad3(The New iPad), iPad mini
? ? ? ? ? ?iPod Touch 3G, iPod Touch4
armv7s設(shè)備:iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 設(shè)備:iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)
最常用匯編指令
str 將數(shù)據(jù)從寄存器中讀取存放到內(nèi)存
ldr 將內(nèi)存中的數(shù)據(jù)讀取放到寄存器
bl ?跳轉(zhuǎn)
32位寄存器
R0-R3 ? //函數(shù)的前4個參數(shù)放在R0-R3中,其他的參數(shù)放到棧中,返回值在R0 ??
R7 ?
R9
R13 ? ?//SP寄存器
R14 ? ?//LR寄存器,保存函數(shù)返回地址
R15 ? ?//PC寄存器
32位的寄存器容量是8位,64位寄存器的容量16位的,數(shù)量也更多一些,x1,x2,x3...
---------------------------------------------------------------------
以下是64位的arm匯編的一個實(shí)例,理解arm匯編的函數(shù)調(diào)用的過程。
打開Xcode,新建ios工程,在main.m下寫如下代碼
在Xcode菜單欄選擇Product=>Perform Action => Assemble main.m, 注意選擇在真機(jī)編譯才能生成arm匯編,在模擬器是x86的。
顯示代碼有很多.loc開頭的鬼東西,為了看著方便可以刪掉。
_funcAdd: ; @funcAdd Lfunc_begin0:.loc 1 13 0 ; /Users/exchen/Desktop/armasm/armasm/main.m:13:0.cfi_startproc ; BB#0:sub sp, sp, #32 ; =32 Ltmp1:.cfi_def_cfa_offset 32str w0, [sp, #28] ;將w0寄存器的值放入sp+28,第1個參數(shù)astr w1, [sp, #24] ;將w1寄存器的值放入sp+24,第2個參數(shù)bstr w2, [sp, #20] ;將w2寄存器的值放入sp+20,第3個參數(shù)cstr w3, [sp, #16] ;將w3寄存器的值放入sp+16,第4個參數(shù)dstr w4, [sp, #12] ;將w4寄存器的值放入sp+12,第5個參數(shù)estr w5, [sp, #8] ;將w5寄存器的值放入sp+8, 第6個參數(shù)f.loc 1 14 11 prologue_end ; /Users/boot/Desktop/armasm/armasm/main.m:14:11 Ltmp2:ldr w0, [sp, #28] ;將第1個參數(shù)a放入w0寄存器ldr w1, [sp, #24] ;將第2個參數(shù)b放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #20] ;將第3個參數(shù)e放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #16] ;將第4個參數(shù)d放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #12] ;將第5個參數(shù)e放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器ldr w1, [sp, #8] ;將最后一個參數(shù)f放入w1寄存器add w0, w0, w1 ;將w0和w1的值相加并存入w0寄存器str w0, [sp, #4] ldr w0, [sp, #4]add sp, sp, #32 ; =32ret Ltmp3: Lfunc_end0:
這是在真機(jī)運(yùn)行的匯編代碼和上面是一樣的。
armasm`funcAdd:0x1000389f0 <+0>: sub sp, sp, #320x1000389f4 <+4>: str w0, [sp, #28]0x1000389f8 <+8>: str w1, [sp, #24]0x1000389fc <+12>: str w2, [sp, #20]0x100038a00 <+16>: str w3, [sp, #16]0x100038a04 <+20>: str w4, [sp, #12]0x100038a08 <+24>: str w5, [sp, #8] -> 0x100038a0c <+28>: ldr w0, [sp, #28]0x100038a10 <+32>: ldr w1, [sp, #24]0x100038a14 <+36>: add w0, w0, w10x100038a18 <+40>: ldr w1, [sp, #20]0x100038a1c <+44>: add w0, w0, w10x100038a20 <+48>: ldr w1, [sp, #16]0x100038a24 <+52>: add w0, w0, w10x100038a28 <+56>: ldr w1, [sp, #12]0x100038a2c <+60>: add w0, w0, w10x100038a30 <+64>: ldr w1, [sp, #8]0x100038a34 <+68>: add w0, w0, w10x100038a38 <+72>: str w0, [sp, #4]0x100038a3c <+76>: ldr w0, [sp, #4]0x100038a40 <+80>: add sp, sp, #320x100038a44 <+84>: ret
main函數(shù)里調(diào)用funcAdd的過程
.globl _main.align 2 _main: ; @main Lfunc_begin1:.loc 1 17 0 is_stmt 1 ; /Users/exchen/Desktop/armasm/armasm/main.m:17:0.cfi_startproc ; BB#0:stp x29, x30, [sp, #-16]!mov x29, spsub sp, sp, #64 ; =64 Ltmp4:.cfi_def_cfa w29, 16 Ltmp5:.cfi_offset w30, -8 Ltmp6:.cfi_offset w29, -16orr w8, wzr, #0x1 ;和mov w8,#0x1是一樣的orr w9, wzr, #0x2 ;同上orr w2, wzr, #0x3orr w3, wzr, #0x4movz w4, #0x5orr w5, wzr, #0x6stur wzr, [x29, #-4]stur w0, [x29, #-8]stur x1, [x29, #-16] mov x0, x8mov x1, x9 ;到這我們發(fā)現(xiàn),函數(shù)參數(shù)1-6依次存放到w0-w5,或者說是x1-x5,這和32位是有很大區(qū)別的。bl 0x1000d09f0 ;調(diào)用funcAddmain函數(shù)真機(jī)運(yùn)行的匯編代碼
armasm`main:0x1000d0a48 <+0>: stp x29, x30, [sp, #-16]!0x1000d0a4c <+4>: mov x29, sp0x1000d0a50 <+8>: sub sp, sp, #640x1000d0a54 <+12>: orr w8, wzr, #0x1 0x1000d0a58 <+16>: orr w9, wzr, #0x20x1000d0a5c <+20>: orr w2, wzr, #0x30x1000d0a60 <+24>: orr w3, wzr, #0x40x1000d0a64 <+28>: movz w4, #0x50x1000d0a68 <+32>: orr w5, wzr, #0x60x1000d0a6c <+36>: stur wzr, [x29, #-4]0x1000d0a70 <+40>: stur w0, [x29, #-8]0x1000d0a74 <+44>: stur x1, [x29, #-16] -> 0x1000d0a78 <+48>: mov x0, x80x1000d0a7c <+52>: mov x1, x90x1000d0a80 <+56>: bl 0x1000d09f0 ; funcAdd at main.m:13
總結(jié)
以上是生活随笔為你收集整理的iOS Hacker Xcode玩转arm64汇编基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS Hacker Keychain相
- 下一篇: iOS Hacker Xcode使用和内