ios 逆向匯編指令if 纤怒,while do ,switch 條件語句匯編的變化

循環(huán)&選擇
cmp(Compare)比較指令

CMP 把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進(jìn)行比較嘹黔。但不存儲結(jié)果,只是正確的更改標(biāo)志涂身。

一般CMP做完判斷后會進(jìn)行跳轉(zhuǎn)雄卷,后面通常會跟上B指令

BL 標(biāo)號:跳轉(zhuǎn)到標(biāo)號處執(zhí)行

B.LT 標(biāo)號:比價結(jié)果是小于(less than),執(zhí)行標(biāo)號蛤售,否則不跳轉(zhuǎn)

B.LE 標(biāo)號:比較結(jié)果是小于等于(less than or qeual to)丁鹉,執(zhí)行標(biāo)號妒潭,否則不跳轉(zhuǎn)

B.GT 標(biāo)號:比較結(jié)果是大于(greater than),執(zhí)行標(biāo)號鳄炉,否則不跳轉(zhuǎn)

B.GE 標(biāo)號:比較結(jié)果是大于等于(greater than or equal to)杜耙,執(zhí)行標(biāo)號,否則不跳轉(zhuǎn)

B.EQ 標(biāo)號:比較結(jié)果是等于(equal to)拂盯,執(zhí)行標(biāo)號佑女,否則不跳轉(zhuǎn)

B.NE 標(biāo)號:比較結(jié)果是不等于(not equal to),執(zhí)行標(biāo)號谈竿,否則不跳轉(zhuǎn)

B.LS 標(biāo)號:比較結(jié)果是無符號小于等于团驱,執(zhí)行標(biāo)號,否則不跳轉(zhuǎn)

B.LO 標(biāo)號:比較結(jié)果是無符號小于空凸,執(zhí)行標(biāo)號嚎花,否則不跳轉(zhuǎn)

B.HI 標(biāo)號:比較結(jié)果是無符號大于,執(zhí)行標(biāo)號呀洲,否則不跳轉(zhuǎn)

B.HS 標(biāo)號:比較結(jié)果是無符號大于等于紊选,執(zhí)行標(biāo)號,否則不跳轉(zhuǎn)

一.分析if 和全局變量的匯編代碼

0x10264a734 <+0>: sub sp, sp,#0x10 ; =0x10 //開辟一個16字節(jié)空間

0x10264a738<+4>:  str    w0, [sp,#0xc]  // w0值放入了椀蓝海空間兵罢,位置是sp偏移#0xc

0x10264a73c<+8>:  str    w1, [sp,#0x8]  // w1 w0和w1的值放入了棧空間滓窍,位置是sp偏移#0x8

-> 0x10264a740<+12>: ldr w8, [sp,#0xc] //把椔舸剩空間的值讀出來放入寄存器w8

0x10264a744<+16>: ldr    w9, [sp,#0x8] //把棧空間的值讀出來放入寄存器w9

0x10264a748<+20>: cmp    w8, w9  //比較w8,w9

0x10264a74c<+24>: b.le 0x10264a764 //比較結(jié)果是小于等于(less than or qeual to)吏夯,執(zhí)行標(biāo)號此蜈,否則不跳轉(zhuǎn)

0x10264a750<+28>: ldr    w8, [sp,#0xc]  //把棧空間的值讀出來放入寄存器w8

0x10264a754<+32>: adrp  x9,2  // 2左移12位0x10264a000 + 2  0x10264c000

0x10264a758 <+36>: add    x9, x9,#0xd88        //0x10264c000 +0xd88  = 0x10264cd88

0x10264a75c<+40>: str    w8, [x9] //w9 地址值寫個W8

0x10264a760<+44>: b      0x10264a774    //跳轉(zhuǎn)到  0x10264a774     

0x10264a764<+48>: ldr    w8, [sp,#0x8]  //讀取 sp 偏移0x8 的地址給w8

0x10264a768<+52>: adrp  x9,2 / 2左移12位0x10264a000 + 2  0x10264c000

0x10264a76c <+56>: add    x9, x9,#0xd88            //0x10264c000 +0xd88  = 0x10264cd88

0x10264a770<+60>: str    w8, [x9]    把x9 的地址給 w8

0x10264a774 <+64>: add    sp, sp,#0x10            ; =0x10 //棧平衡

0x10264a778<+68>: ret 

Switch

1噪生、假設(shè)switch語句的分支比較少的時候(例如3裆赵,少于4的時候沒有意義)沒有必要使用此結(jié)構(gòu),相當(dāng)于if跺嗽。
2顾瞪、各個分支常量的差值較大的時候,編譯器會在效率還是內(nèi)存進(jìn)行取舍抛蚁,這個時候編譯器還是會編譯成類似于if陈醒,else的結(jié)構(gòu)。
3瞧甩、在分支比較多的時候:在編譯的時候會生成一個表(跳轉(zhuǎn)表每個地址四個字節(jié))钉跷。

當(dāng)switch條件小于4個的時候就是if匯編的判斷

0x10465a124 <+16>:  ldur   w8, [x29, #-0x4]
0x10465a128 <+20>:  cmp    w8, #0x1                  ; =0x1 
0x10465a12c <+24>:  str    w8, [sp, #0x8]
0x10465a130 <+28>:  b.eq   0x10465a158               ; <+68> at main.m
0x10465a134 <+32>:  b      0x10465a138               ; <+36> at main.m
0x10465a138 <+36>:  ldr    w8, [sp, #0x8]
0x10465a13c <+40>:  cmp    w8, #0x2                  ; =0x2 
0x10465a140 <+44>:  b.eq   0x10465a168               ; <+84> at main.m
0x10465a144 <+48>:  b      0x10465a148               ; <+52> at main.m
0x10465a148 <+52>:  ldr    w8, [sp, #0x8]
0x10465a14c <+56>:  cmp    w8, #0x3                  ; =0x3 
0x10465a150 <+60>:  b.eq   0x10465a178               ; <+100> at main.m
0x10465a154 <+64>:  b      0x10465a188               ; <+116> at main.m

當(dāng)條件大于4個

0x10242a100 <+20>:  subs   w8, w8, #0x1              ; =0x1 
0x10242a104 <+24>:  mov    x9, x8
0x10242a108 <+28>:  ubfx   x9, x9, #0, #32
0x10242a10c <+32>:  cmp    x9, #0x4                  ; =0x4 
0x10242a110 <+36>:  str    x9, [sp]
0x10242a114 <+40>:  b.hi   0x10242a170               ; <+132> at main.m
0x10242a118 <+44>:  adrp   x8, 0
0x10242a11c <+48>:  add    x8, x8, #0x188            ; =0x188 
0x10242a120 <+52>:  ldr    x11, [sp]
0x10242a124 <+56>:  ldrsw  x10, [x8, x11, lsl #2]
0x10242a128 <+60>:  add    x9, x8, x10
0x10242a12c <+64>:  br     x9
0x10242a130 <+68>:  adrp   x0, 1
0x10242a134 <+72>:  add    x0, x0, #0xf69            ; =0xf69 
0x10242a138 <+76>:  bl     0x10242a588               ; symbol stub for: printf
0x10242a13c <+80>:  b      0x10242a17c  

源碼

void funcA(int a){
      switch (a) {//
          case 1:
              printf("打坐");
        break;
          case 2:
            printf("加紅");
        break;
        case 3:
            printf("加藍(lán)");
        break;
        case 5:
        printf("打怪");
        break;
        default:
            printf("啥都不干");
        break;
  }
}
匯編代碼
0x10242a0ec <+0>:   sub    sp, sp, #0x20             ; =0x20 
0x10242a0f0 <+4>:   stp    x29, x30, [sp, #0x10]
0x10242a0f4 <+8>:   add    x29, sp, #0x10            ; =0x10 
0x10242a0f8 <+12>:  stur   w0, [x29, #-0x4]
0x10242a0fc <+16>:  ldur   w8, [x29, #-0x4]
0x10242a100 <+20>:  subs   w8, w8, #0x1              ; =0x1 
0x10242a104 <+24>:  mov    x9, x8
0x10242a108 <+28>:  ubfx   x9, x9, #0, #32
0x10242a10c <+32>:  cmp    x9, #0x4                  ; =0x4 
0x10242a110 <+36>:  str    x9, [sp]
0x10242a114 <+40>:  b.hi   0x10242a170               ; <+132> at main.m
0x10242a118 <+44>:  adrp   x8, 0
0x10242a11c <+48>:  add    x8, x8, #0x188            ; =0x188 
0x10242a120 <+52>:  ldr    x11, [sp]
0x10242a124 <+56>:  ldrsw  x10, [x8, x11, lsl #2]
0x10242a128 <+60>:  add    x9, x8, x10
0x10242a12c <+64>:  br     x9
0x10242a130 <+68>:  adrp   x0, 1
0x10242a134 <+72>:  add    x0, x0, #0xf69            ; =0xf69 
0x10242a138 <+76>:  bl     0x10242a588               ; symbol stub for: printf
0x10242a13c <+80>:  b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a140 <+84>:  adrp   x0, 1
0x10242a144 <+88>:  add    x0, x0, #0xf70            ; =0xf70 
0x10242a148 <+92>:  bl     0x10242a588               ; symbol stub for: printf
0x10242a14c <+96>:  b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a150 <+100>: adrp   x0, 1
0x10242a154 <+104>: add    x0, x0, #0xf77            ; =0xf77 
0x10242a158 <+108>: bl     0x10242a588               ; symbol stub for: printf
0x10242a15c <+112>: b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a160 <+116>: adrp   x0, 1
0x10242a164 <+120>: add    x0, x0, #0xf7e            ; =0xf7e 
0x10242a168 <+124>: bl     0x10242a588               ; symbol stub for: printf
0x10242a16c <+128>: b      0x10242a17c               ; <+144> at main.m:30:1
0x10242a170 <+132>: adrp   x0, 1
0x10242a174 <+136>: add    x0, x0, #0xf85            ; =0xf85 
0x10242a178 <+140>: bl     0x10242a588               ; symbol stub for: printf
0x10242a17c <+144>: ldp    x29, x30, [sp, #0x10]
0x10242a180 <+148>: add    sp, sp, #0x20             ; =0x20 
0x10242a184 <+152>: ret 

0x10242a10c <+32>: cmp x9, #0x4 // 表示case 最大與最小差值

ldrsw x10, [x8, x11, lsl #2] // 建立了一張地址表 根據(jù)數(shù)據(jù)源的size大小和偏移尋址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肚逸,隨后出現(xiàn)的幾起案子爷辙,更是在濱河造成了極大的恐慌彬坏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膝晾,死亡現(xiàn)場離奇詭異栓始,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)血当,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門幻赚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臊旭,你說我怎么就攤上這事落恼。” “怎么了离熏?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵佳谦,是天一觀的道長。 經(jīng)常有香客問我滋戳,道長钻蔑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任奸鸯,我火速辦了婚禮矢棚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘府喳。我一直安慰自己,他們只是感情好蘑拯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布钝满。 她就那樣靜靜地躺著,像睡著了一般申窘。 火紅的嫁衣襯著肌膚如雪弯蚜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天剃法,我揣著相機(jī)與錄音碎捺,去河邊找鬼。 笑死贷洲,一個胖子當(dāng)著我的面吹牛收厨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播优构,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诵叁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钦椭?” 一聲冷哼從身側(cè)響起拧额,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碑诉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侥锦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體进栽,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年恭垦,在試婚紗的時候發(fā)現(xiàn)自己被綠了快毛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡署照,死狀恐怖祸泪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情建芙,我是刑警寧澤没隘,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站禁荸,受9級特大地震影響右蒲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赶熟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一瑰妄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧映砖,春花似錦间坐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至地技,卻和暖如春蜈七,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莫矗。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工飒硅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人作谚。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓三娩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妹懒。 傳聞我的和親對象是個殘疾皇子尽棕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容