匯編-----函數(shù)的本質

通過匯編代碼我們可以探索函數(shù)的本質

  • 1: 如果函數(shù)內部沒有調用其他函數(shù), 那么sp不會進行偏移, 編譯器會通過mov bp - N, 0x11的方式向棧中存入數(shù)據(jù). 這是編譯器所進行的優(yōu)化.這個時候這個棧中的區(qū)域被稱為 紅色區(qū)域 不超過128個字節(jié)
    • 如果局部變量超過128個字節(jié), 那么還是需要 sub sp, N來開辟棸嗝校空間
  int sum(int a, int b, int c) {
      int x = 10;
     // test();
      return a + b + c + x;
  }
可以看到, 如果函數(shù)內部沒有調用其他函數(shù), 并且所有參數(shù)的總字節(jié)數(shù)沒有超過128個字節(jié)時 CPU并不會開辟新的空間,而是使用紅色區(qū)域去存儲變量
safe005`sum:
    0x103d90700 <+0>:  pushq  %rbp
    0x103d90701 <+1>:  movq   %rsp, %rbp
    0x103d90704 <+4>:  movl   %edi, -0x4(%rbp)
    0x103d90707 <+7>:  movl   %esi, -0x8(%rbp)
    0x103d9070a <+10>: movl   %edx, -0xc(%rbp)
->  0x103d9070d <+13>: movl   $0xa, -0x10(%rbp)
    0x103d90714 <+20>: movl   -0x4(%rbp), %edx
    0x103d90717 <+23>: addl   -0x8(%rbp), %edx
    0x103d9071a <+26>: addl   -0xc(%rbp), %edx
    0x103d9071d <+29>: addl   -0x10(%rbp), %edx
    0x103d90720 <+32>: movl   %edx, %eax
    0x103d90722 <+34>: popq   %rbp
    0x103d90723 <+35>: retq   
  • 2: 如果函數(shù)內部調用其他函數(shù), 則必會通過 sub sp, N 來開辟棻咂唬空間
  void test() {
    
  }

  int sum(int a, int b, int c) {
      int x = 10;
      test();
      return a + b + c + x;
  }
以下是上邊函數(shù)的匯編代碼, 可以看到, 如果函數(shù)內部調用了其他函數(shù), 則sp必會上移,開辟棸诿粒空間, 這時候 下一條指令的地址在 椝常空間上一位, bp在上2位
    0x10417b6f0 <+0>:  pushq  %rbp
    0x10417b6f1 <+1>:  movq   %rsp, %rbp
    0x10417b6f4 <+4>:  subq   $0x10, %rsp
    0x10417b6f8 <+8>:  movl   %edi, -0x4(%rbp)
    0x10417b6fb <+11>: movl   %esi, -0x8(%rbp)
    0x10417b6fe <+14>: movl   %edx, -0xc(%rbp)
->  0x10417b701 <+17>: movl   $0xa, -0x10(%rbp)
    0x10417b708 <+24>: callq  0x10417b6e0               ; test at main.m:12
    0x10417b70d <+29>: movl   -0x4(%rbp), %edx
    0x10417b710 <+32>: addl   -0x8(%rbp), %edx
    0x10417b713 <+35>: addl   -0xc(%rbp), %edx
    0x10417b716 <+38>: addl   -0x10(%rbp), %edx
    0x10417b719 <+41>: movl   %edx, %eax
    0x10417b71b <+43>: addq   $0x10, %rsp
    0x10417b71f <+47>: popq   %rbp
    0x10417b720 <+48>: retq

棧幀

  • 棧幀指的是 sp和bp之間的空間 8086CPU中棧幀很明顯就可以看到, 不過64位的CPU中 由于寄存器得到充分的運用, 所以棧幀不是每次函數(shù)調用都可以出現(xiàn)的

全局變量

image.png
  • 如上圖所示, 全局變量相對于app來說, 其偏移地址一直是固定不變的, 而基地址是基于整個app在內存中的物理地址來隨時改變的

if 判斷

int a = 2;
        if (a == 1) {
            NSLog(@"a == 1");
        } else if (a == 2) {
            NSLog(@"a == 2");
        } else if (a == 3) {
            NSLog(@"a == 3");
        } else if (a == 4) {
            NSLog(@"a == 4");
        }
  0x1014926bb <+27>:  movl   $0x2, -0x14(%rbp) ;  賦值
->  0x1014926c2 <+34>:  cmpl   $0x1, -0x14(%rbp) ; cmp = cpmpare 比較
    0x1014926c6 <+38>:  movq   %rax, -0x20(%rbp)
    0x1014926ca <+42>:  jne    0x1014926e6               ; <+70> at main.m:21  ; jne: jump not equl 不等的時候跳轉到0x1014926e6指令
    0x1014926d0 <+48>:  leaq   0x1989(%rip), %rax        ; @"a == 1"
    0x1014926d7 <+55>:  movq   %rax, %rdi
    0x1014926da <+58>:  movb   $0x0, %al
    0x1014926dc <+60>:  callq  0x101492a14               ; symbol stub for: NSLog
    0x1014926e1 <+65>:  jmp    0x101492750               ; <+176> at main.m:29
    0x1014926e6 <+70>:  cmpl   $0x2, -0x14(%rbp) 
    0x1014926ea <+74>:  jne    0x101492706               ; <+102> at main.m:23
    0x1014926f0 <+80>:  leaq   0x1989(%rip), %rax        ; @"a == 2"
    0x1014926f7 <+87>:  movq   %rax, %rdi
    0x1014926fa <+90>:  movb   $0x0, %al
    0x1014926fc <+92>:  callq  0x101492a14               ; symbol stub for: NSLog
    0x101492701 <+97>:  jmp    0x10149274b               ; <+171> at main.m
    0x101492706 <+102>: cmpl   $0x3, -0x14(%rbp)
    0x10149270a <+106>: jne    0x101492726               ; <+134> at main.m:25
    0x101492710 <+112>: leaq   0x1989(%rip), %rax        ; @"a == 3"
    0x101492717 <+119>: movq   %rax, %rdi
  • 以上代碼是if判斷的匯編實現(xiàn), 問題來了, jne的時候 怎么判斷是否相等而去跳轉呢?
    • 是用標記寄存區(qū)來存放比較的結果的:


      image.png
      • 如上圖, cmp前后 如果rflags值沒有發(fā)生改變, 說明并不相等; 若發(fā)生改變, 說明相等
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市傅联,隨后出現(xiàn)的幾起案子矩距,更是在濱河造成了極大的恐慌捞镰,老刑警劉巖忆绰,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浩峡,死亡現(xiàn)場離奇詭異,居然都是意外死亡错敢,警方通過查閱死者的電腦和手機翰灾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚茅,“玉大人纸淮,你說我怎么就攤上這事⊙窍恚” “怎么了咽块?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欺税。 經常有香客問我侈沪,道長,這世上最難降的妖魔是什么晚凿? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任亭罪,我火速辦了婚禮,結果婚禮上歼秽,老公的妹妹穿的比我還像新娘应役。我一直安慰自己,他們只是感情好哲银,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布扛吞。 她就那樣靜靜地躺著,像睡著了一般荆责。 火紅的嫁衣襯著肌膚如雪滥比。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天做院,我揣著相機與錄音盲泛,去河邊找鬼。 笑死键耕,一個胖子當著我的面吹牛寺滚,可吹牛的內容都是我干的。 我是一名探鬼主播屈雄,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼村视,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酒奶?” 一聲冷哼從身側響起蚁孔,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤奶赔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杠氢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體站刑,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年鼻百,在試婚紗的時候發(fā)現(xiàn)自己被綠了绞旅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡温艇,死狀恐怖因悲,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情中贝,我是刑警寧澤囤捻,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站邻寿,受9級特大地震影響,放射性物質發(fā)生泄漏视哑。R本人自食惡果不足惜绣否,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挡毅。 院中可真熱鬧蒜撮,春花似錦、人聲如沸跪呈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耗绿。三九已至苹支,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误阻,已是汗流浹背债蜜。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留究反,地道東北人寻定。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像精耐,于是被迫代替她去往敵國和親狼速。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容

  • 原文地址:C語言函數(shù)調用棧(一)C語言函數(shù)調用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調用卦停。當一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,629評論 1 19
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎入門學習匯編語言》系列視頻的筆記,在此感謝他和像他一樣...
    Gibbs基閱讀 37,247評論 8 114
  • 春天來了攀痊,邁著輕柔的腳步桐腌,踩綠了程家沖的山川河流,踩綠了田野苟径,程家子女賞油菜花中案站,瞧他們沉醉于春天的濃意,陶醉于山...
    xiao程故事閱讀 419評論 2 0
  • 上一篇關于KVC的講解中我們說到了KVC提供了一種通過key來訪問類的屬性以及成員變量的機制棘街。今天要說的KVO是提...
    TyroneTang閱讀 225評論 0 1
  • 最近有一些品牌方向我咨詢蟆盐,老師,我經常聽到直營微商遭殉,直營模式石挂,什么是直營模式? 那今天就和大家討論一下微商企業(yè)直營...
    龔川騰閱讀 567評論 0 0