函數(shù)調(diào)用棧平衡

棧平衡

  • 棧平衡:函數(shù)調(diào)用前后的棧頂指針指向的位置不變

內(nèi)平棧 外平棧

  • 內(nèi)平棧: 指的是在函數(shù)調(diào)用返回之前使棧保持平衡(一般使用寄存器傳參一般都是內(nèi)平棧)
  • 外平棧:在函數(shù)調(diào)用后通過操作使棧保持平衡 (一般使用棧傳參的是外平棧)
函數(shù)的調(diào)用流程 (使用棧傳參)
  1. push參數(shù)
  2. push函數(shù)的返回地址
  3. push bp (保留bp之前的值胡嘿,方便以后恢復(fù)bp的值)
  4. mov bp, sp (保留sp之前的值,方便以后恢復(fù)sp)
  5. sub sp, 空間大小 (分配空間給函數(shù)內(nèi)部的局部變量使用)
  6. 保護可能用到的寄存器
  7. 填充局部變量的的空間
  8. 執(zhí)行業(yè)務(wù)邏輯
  9. 恢復(fù)寄存器之前的值
  10. mov sp, bp (恢復(fù)sp之前的值)
  11. pop bp (恢復(fù)bp之前的值)
  12. ret (將函數(shù)的返回地址出棧,執(zhí)行下一條指令)
  13. 恢復(fù)站平衡 (add sp, 參數(shù)占用的空間)
  • sp 寄存器:棧頂?shù)膬?nèi)存地址
  • bp 寄存器:輔助sp寄存器的寄存器
  1. sp 指向棧頂
  2. 方法結(jié)束后又要指向棧里面的函數(shù)返回地址
  3. 需要一個記錄員 當(dāng)sp不指向棧里面的函數(shù)返回地址 時記錄下sp當(dāng)前的位置
  4. 所以當(dāng)參數(shù)入棧之后 函數(shù)返回值地址入棧后先要 保護bp寄存器的值

; 返回值放ax寄存器
; 傳遞2個參數(shù)(放入棧中)
sum:
    ; 保護bp
    push bp
    ; 保存sp之前的值:指向bp以前的值
    mov bp, sp
    ; 預(yù)留10個字節(jié)的空間給局部變量
    sub sp, 10

    ; 保護可能會用到的寄存器
    push si
    push di
    push bx

    ; 給局部變量空間填充int 3(CCCC)
    ; stosw的作用:將ax的值拷貝到es:di中,同時di的值會+2
    mov ax, 0cccch
    ; 讓es等于ss
    mov bx, ss
    mov es, bx
    ; 讓di等于bp-10(局部變量地址最小的區(qū)域)
    mov di, bp
    sub di, 10
    ; cx決定了stosw的執(zhí)行次數(shù)
    mov cx, 5
    rep stosw
    ; rep的作用:重復(fù)執(zhí)行某個指令(執(zhí)行次數(shù)由cx決定)

    ; -------- 業(yè)務(wù)邏輯 - begin
    ; 定義2個局部變量
    mov word ptr ss:[bp-2], 3
    mov word ptr ss:[bp-4], 4
    mov ax, ss:[bp-2]
    add ax, ss:[bp-4]
    mov ss:[bp-6], ax

    ; 訪問棧中的參數(shù)
    mov ax, ss:[bp+4]
    add ax, ss:[bp+6]
    add ax, ss:[bp-6]
    ; -------- 業(yè)務(wù)邏輯 - end

    ; 恢復(fù)寄存器的值
    pop bx
    pop di
    pop si

    ; 恢復(fù)sp
    mov sp, bp
    ; 恢復(fù)bp
    pop bp

    ret
函數(shù)調(diào)用流程圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埂材,一起剝皮案震驚了整個濱河市裙品,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖谍肤,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琅关,死亡現(xiàn)場離奇詭異煮岁,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門画机,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冶伞,“玉大人,你說我怎么就攤上這事步氏∠烨荩” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵荚醒,是天一觀的道長金抡。 經(jīng)常有香客問我,道長腌且,這世上最難降的妖魔是什么梗肝? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮铺董,結(jié)果婚禮上巫击,老公的妹妹穿的比我還像新娘。我一直安慰自己精续,他們只是感情好坝锰,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著重付,像睡著了一般顷级。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上确垫,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天弓颈,我揣著相機與錄音,去河邊找鬼删掀。 笑死翔冀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的披泪。 我是一名探鬼主播纤子,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼款票!你這毒婦竟也來了控硼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤艾少,失蹤者是張志新(化名)和其女友劉穎卡乾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姆钉,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡说订,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年抄瓦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陶冷。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡钙姊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埂伦,到底是詐尸還是另有隱情煞额,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布沾谜,位于F島的核電站膊毁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏基跑。R本人自食惡果不足惜婚温,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媳否。 院中可真熱鬧栅螟,春花似錦、人聲如沸篱竭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掺逼。三九已至吃媒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吕喘,已是汗流浹背赘那。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兽泄,地道東北人漓概。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像病梢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梁肿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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