iOS之ARM64匯編

iOS的程序都是跑在ARM架構(gòu)的機(jī)器上,所以iOS的匯編用到的就是ARM匯編

對(duì)于iOS開發(fā)匯編的分類:

  1. x86匯編 模擬器
  2. ARM64/ARM32匯編 真機(jī)64位/真機(jī)32位得湘,目前真機(jī)大多數(shù)都是64位陵珍。

ARM64匯編三個(gè)重要概念:

  1. 寄存器
    ARM64 有34個(gè)寄存器缆瓣,包括31個(gè)通用寄存器、SP马靠、PC赏表、CPSR。
(lldb) register read
General Purpose Registers:
        x0 = 0x000000012c025350
        x1 = 0x000000012c025350
        x2 = 0x000000000000000d
        x3 = 0x0000000000000000
        x4 = 0x000000016f43dab8
        x5 = 0x0000000000000040
        x6 = 0x0000000000000000
        x7 = 0x0000000000000d20
        x8 = 0x00000001009cd688  (void *)0x00000001009cd790: LGPerson
        x9 = 0x56f24077b16c00de
       x10 = 0x000000012c025350
       x11 = 0x00000000000007fb
       x12 = 0x00000000000007fd
       x13 = 0x0000000000000000
       x14 = 0x000000008afee000
       x15 = 0x00000000000003dc
       x16 = 0x00000001aa01d4e8  libobjc.A.dylib`objc_autoreleasePoolPop
       x17 = 0x000000000ae00000
       x18 = 0x0000000000000000
       x19 = 0x0000000000000000
       x20 = 0x000000012be04110
       x21 = 0x00000001efcaf000  
       x22 = 0x00000001e1bb3984  
       x23 = 0x0000000000000001
       x24 = 0x0000000000000001
       x25 = 0x00000001e71bf690  CoreFoundation`__NSArray0__struct
       x26 = 0x000000012be0b130
       x27 = 0x00000001efc2e000  
       x28 = 0x00000001e1bbcfae  
        fp = 0x000000016f43dc60
        lr = 0x00000001009c5bac  001-alloc&init探索`-[ViewController viewDidLoad] + 76 at ViewController.m:28:5
        sp = 0x000000016f43dc30
        pc = 0x00000001009c5bb4  001-alloc&init探索`-[ViewController viewDidLoad] + 84 at ViewController.m:30:20
      cpsr = 0x60000000
  • 通用寄存器:x0~x28(64位的) (w0~w28(32位)對(duì)應(yīng)的的x0~x28的低32位) ,x0~x7一般是用來存儲(chǔ)函數(shù)的參數(shù)酝枢,更多參數(shù)很洋,則用堆棧來傳遞,x0一般用作函數(shù)的返回值
  • PC: 程序計(jì)數(shù)器:存儲(chǔ)著當(dāng)前執(zhí)行的指令
  • FP: x29保存棧幀地址(棧底指針)
  • SP:保存棧指針,使用 SP/WSP來進(jìn)行對(duì)SP寄存器的訪問
  • CPSR:狀態(tài)寄存器
    NZCV是狀態(tài)寄存器的條件標(biāo)志位隧枫,分別代表運(yùn)算過程中產(chǎn)生的狀態(tài)喉磁,其中:
    N, negative condition flag,一般代表運(yùn)算結(jié)果是負(fù)數(shù)
    Z, zero condition flag, 指令結(jié)果為0時(shí)Z=1官脓,否則Z=0协怒;
    C, carry condition flag, 無符號(hào)運(yùn)算有溢出時(shí),C=1卑笨。
    V, oVerflow condition flag 有符號(hào)運(yùn)算有溢出時(shí)孕暇,V=1。
  • LR:通常稱X30為程序鏈接寄存器赤兴,保存子程序結(jié)束后需要執(zhí)行的下一條指令
    每個(gè)寄存器的大小都是8字節(jié)的
  • wzr:32位零寄存器
  • xzr:64位零寄存器
  1. 指令
MOV    X1妖滔,X0         ;將寄存器X0的值傳送到寄存器X1
ADD    X0,X1桶良,X2     ;寄存器X1和X2的值相加后傳送到X0
SUB    X0座舍,X1,X2     ;寄存器X1和X2的值相減后傳送到X0

AND    X0陨帆,X0曲秉,#0xF    ; X0的值與0xF相位與后的值傳送到X0
ORR    X0,X0疲牵,#9      ; X0的值與9相位或后的值傳送到X0
EOR    X0承二,X0,#0xF    ; X0的值與0xF相異或后的值傳送到X0

LDR    X5纲爸,[X6亥鸠,#0x08]        ;ld:load; X6寄存器加0x08的和的地址值內(nèi)的數(shù)據(jù)傳送到X5
LDP  x29, x30, [sp, #0x10]    ; ldp :load pair ; 一對(duì)寄存器, 從內(nèi)存讀取數(shù)據(jù)到寄存器

STR X0, [SP, #0x8]         识啦;st:store,str:往內(nèi)存中寫數(shù)據(jù)(偏移值為正); X0寄存器的數(shù)據(jù)傳送到SP+0x8地址值指向的存儲(chǔ)空間
STUR   w0, [x29, #-0x8]   ;往內(nèi)存中寫數(shù)據(jù)(偏移值為負(fù))
STP  x29, x30, [sp, #0x10]    ;store pair负蚊,存放一對(duì)數(shù)據(jù), 入棧指令

CBZ  ;比較(Compare),如果結(jié)果為零(Zero)就轉(zhuǎn)移(只能跳到后面的指令)
CBNZ ;比較袁滥,如果結(jié)果非零(Non Zero)就轉(zhuǎn)移(只能跳到后面的指令)
CMP  ;比較指令盖桥,相當(dāng)于SUBS灾螃,影響程序狀態(tài)寄存器CPSR 

B   ;跳轉(zhuǎn)指令题翻,可帶條件跳轉(zhuǎn)與cmp配合使用
BL  ;帶返回的跳轉(zhuǎn)指令, 返回地址保存到LR(X30)
BLR  ; 帶返回的跳轉(zhuǎn)指令,跳轉(zhuǎn)到指令后邊跟隨寄存器中保存的地址(例:blr    x8 ;跳轉(zhuǎn)到x8保存的地址中去執(zhí)行)
RET   ;子程序返回指令嵌赠,返回地址默認(rèn)保存在LR(X30)
  • ret:函數(shù)返回塑荒,相當(dāng)于return
  • mov:數(shù)據(jù)傳輸指令
    mov 目的寄存器 被操作數(shù),被操作數(shù)可以是變量姜挺,也可以是寄存器
    例如 mov x0 ,#0x08 或者 mov x0, x1
  • add: 相加后存儲(chǔ)到目標(biāo)寄存器
    例如 :
mov x1 ,#0x09
mov x2 ,#0x010
add x0, x1 ,x2 //x0 = x1 + x2
  • sub:相減齿税,與add類似
mov x1 ,#0x09
mov x2 ,#0x010
sub x0, x1 ,x2 //x0 = x1 - x2
  • cmp:操作數(shù)1,操作數(shù)2
    比較的結(jié)果放在cpsr中
mov x1 ,#0x09
mov x2 ,#0x010
cmp x1, x2 //將x1-x2的結(jié)果放到cpsr狀態(tài)寄存器中
  • b 指令 跳轉(zhuǎn)指令 相當(dāng)于goto
b myCode //跳轉(zhuǎn)到myCode
  • b指令帶條件
    條件域:EQ:相等炊豪、NE:不等于凌箕、GE:大于等于、LE:小于等于词渤、GT:大于牵舱、LT:小于
mov x1 ,#0x09
mov x2 ,#0x010
cmp x1, x2
beq myCode//結(jié)果相等,即cpsr的z位的值為1時(shí)缺虐,跳轉(zhuǎn)到myCode
  • bl指令:帶返回的跳轉(zhuǎn)指令(函數(shù)調(diào)用的匯編代碼跳轉(zhuǎn)實(shí)現(xiàn))
mov x1 ,#0x09
mov x2 ,#0x010
cmp x1, x2
bleq myCode//結(jié)果相等芜壁,即cpsr的z位的值為1時(shí),跳轉(zhuǎn)到myCode
mov x8 ,#0x09 //myCode執(zhí)行完會(huì)返回到這
  • ldr指令高氮,從內(nèi)存中加載數(shù)據(jù)
    例如:
ldr/ldur x0, [x1] //將x1存儲(chǔ)的地址指向的值存入到x0慧妄,x1如果為不存在的地址值,就會(huì)報(bào)錯(cuò)剪芍,野指針
ldr x0, [x1, #0x04] //將x1存儲(chǔ)的地址值加上0x04后的新地址值指向的值存入到x0
  • ldp指令塞淹,從內(nèi)存中加載數(shù)據(jù),放在一對(duì)寄存器中
    例如:
ldp w0,w1, [x2] //將x2存儲(chǔ)的地址指向的值存入到w0罪裹、w1窖铡,前4字節(jié)存放在w0,后4字節(jié)放在w1
  • str/stur指令坊谁,往內(nèi)存中寫數(shù)據(jù)
    例如:
str x0, [x2] //將x0的數(shù)據(jù)费彼,寫入到x2地址指向的內(nèi)存中
  • stp 存放一對(duì)數(shù)據(jù), 入棧指令
    例如
stp x29, x30, [sp, #0x10]  //將x29中的值寫入到sp偏移0x10后的地址指向的內(nèi)存的前8個(gè)字節(jié),x30寫入后面8個(gè)字節(jié)
  1. 堆棧
    對(duì)應(yīng)寄存器:
  • FP: x29保存棧幀地址(棧底指針)
  • LR:通常稱X30為程序鏈接寄存器口芍,保存子程序結(jié)束后需要執(zhí)行的下一條指令
    每個(gè)寄存器的大小都是8字節(jié)的
    函數(shù)的分類:
  • 葉子函數(shù)箍铲,內(nèi)部不再調(diào)用其他函數(shù)的函數(shù),匯編代碼如下:
    對(duì)應(yīng)的c代碼:
void test(){
    int a = 2;
    int b = 3;
}

匯編代碼

_test:                                  ; @test
    .cfi_startproc
; %bb.0:
    sub sp, sp, #16             ; =16鬓椭,sp棧頂指針上移16個(gè)字節(jié)
    .cfi_def_cfa_offset 16
    mov w8, #2 ;將2存入w8寄存器
    str w8, [sp, #12] ;將w8寄存器的數(shù)據(jù)存入到sp下移12個(gè)字節(jié)的所在位置下面的4字節(jié)
    mov w8, #3 ;將3存入w8寄存器
    str w8, [sp, #8] ;將w8寄存器的數(shù)據(jù)存入到sp下移8個(gè)字節(jié)的所在位置下面的4字節(jié)
    add sp, sp, #16             ; =16颠猴,sp棧頂指針下移16個(gè)字節(jié),恢復(fù)到初始位置
    ret
    .cfi_endproc
  • 非葉子函數(shù)小染,除了葉子函數(shù)翘瓮,其他函數(shù)叫非葉子函數(shù)
    對(duì)應(yīng)的c代碼:
void test(){
    int a = 2;
    int b = 3;
}

void testh(){
    test();
    int a = 4;
    int b = 5;
}

匯編代碼

_test:                                  ; @test,與上面的test一致
    .cfi_startproc
; %bb.0:
    sub sp, sp, #16             ; =16
    .cfi_def_cfa_offset 16
    mov w8, #2
    str w8, [sp, #12]
    mov w8, #3
    str w8, [sp, #8]
    add sp, sp, #16             ; =16
    ret
    .cfi_endproc
                                        ; -- End function
    .globl  _testh                  ; -- Begin function testh
    .p2align    2
_testh:                                 ; @testh裤翩,非葉子函數(shù)
    .cfi_startproc
; %bb.0:
    sub sp, sp, #32             ; =32 资盅,開辟32字節(jié)棧空間
    stp x29, x30, [sp, #16]     ; 16-byte Folded Spill,在一開始分配的32字節(jié)空間上呵扛,給fp(x29)寄存器每庆,lr(x30)寄存器各分配8字節(jié)的空間
    add x29, sp, #16            ; =16,將fp寄存器指向棧底向上偏移16字節(jié)位置今穿,即存儲(chǔ)fp和lr寄存器后剩余的空間缤灵。
    .cfi_def_cfa w29, 16
    .cfi_offset w30, -8
    .cfi_offset w29, -16
    bl  _test  ;跳轉(zhuǎn)到test
    mov w8, #4  ;給a蓝晒,b兩個(gè)變量分配內(nèi)存空間腮出,在剩余的16字節(jié)空間上分配,與test類似
    stur    w8, [x29, #-4]
    mov w8, #5
    str w8, [sp, #8]
    ldp x29, x30, [sp, #16]     ; 16-byte Folded Reload芝薇,讀取fp利诺,lr
    add sp, sp, #32             ; =32,收回函數(shù)調(diào)用検T铮空間
    ret
    .cfi_endproc
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慢逾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灭红,更是在濱河造成了極大的恐慌侣滩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件变擒,死亡現(xiàn)場(chǎng)離奇詭異君珠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娇斑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門策添,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毫缆,你說我怎么就攤上這事唯竹。” “怎么了苦丁?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵浸颓,是天一觀的道長。 經(jīng)常有香客問我旺拉,道長产上,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任蛾狗,我火速辦了婚禮晋涣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沉桌。我一直安慰自己谢鹊,他們只是感情好算吩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撇贺,像睡著了一般赌莺。 火紅的嫁衣襯著肌膚如雪冰抢。 梳的紋絲不亂的頭發(fā)上松嘶,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音挎扰,去河邊找鬼翠订。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遵倦,可吹牛的內(nèi)容都是我干的尽超。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼梧躺,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼似谁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掠哥,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤巩踏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后续搀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塞琼,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年禁舷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彪杉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牵咙,死狀恐怖派近,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洁桌,我是刑警寧澤构哺,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站战坤,受9級(jí)特大地震影響曙强,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜途茫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一碟嘴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囊卜,春花似錦娜扇、人聲如沸错沃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枢析。三九已至,卻和暖如春刃麸,著一層夾襖步出監(jiān)牢的瞬間醒叁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工泊业, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留把沼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓吁伺,卻偏偏與公主長得像饮睬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篮奄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345