匯編-----棧的平衡 && 現(xiàn)場(chǎng)保護(hù)

匯編中使用call指令的時(shí)候, 需要注意棧的平衡

函數(shù)棧平衡, 保證函數(shù)調(diào)用前后,sp是一致的

  • 1.外平棧: 由函數(shù)外部保持棧平衡
  • 2.內(nèi)平棧: 由函數(shù)內(nèi)部保持棧平衡
assume cs:code, ds:data, ss:stack
stack segment
        db 20 dup(1) ; 定義20個(gè)字節(jié)作為棧段
stack ends

data segment
        db 20 dup(2)
        str db 'Hello world!$'
data ends

code segment
start:
      mov ax, data
      mov ds, ax
      mov ax, stack
      mov ss, ax

      push 1
      push 2
      call sum  ;相當(dāng)于函數(shù)調(diào)用
     ; add sp, 4  ;可以在函數(shù)調(diào)用完畢進(jìn)行平棧,外平棧
      mov ax, 4ch
      int 21h
sum: 
      mov bp, sp ;將sp賦值給bp寄存器,bp是專門(mén)用來(lái)代替sp進(jìn)行尋址用的寄存器
      sub sp, 20; 預(yù)留N個(gè)字節(jié)的空間給局部變量
      mov ss:[bp - 2], 3
      mov ss:[bp - 4], 4 ;局部變量粗如棧預(yù)留空間中
      mov ax, ss:[bp + 2]
      add ax, ss:[bp + 4]
      add ax, ss:[bp - 2]
      add ax, ss:[bp - 4] ;取出局部變量
      mov sp, bp ;將sp回到下一條指令的地址所存放的站地址
      ret 4 ;在函數(shù)內(nèi)部 ret將下一條指令的地址pop完畢后進(jìn)行平棧, 內(nèi)平棧
      
code end
end start

函數(shù)的局部變量

  • 當(dāng)函數(shù)內(nèi)部聲明變量的時(shí)候, 棧會(huì)有一部分預(yù)留空間(即sp - N)來(lái)給局部變量使用, 防止函數(shù)外部push的時(shí)候, 覆蓋局部變量
    • 取參數(shù)的時(shí)候是bp + N(N為2的倍數(shù)), 取局部變量的時(shí)候是 bp - N

問(wèn)題1: 在函數(shù)中調(diào)用函數(shù), 按照上邊的理解, bp會(huì)指向下一個(gè)函數(shù)棧空間中的指令地址,那么ret后, 怎么平棧呢?

  • 所以進(jìn)入函數(shù)的第一件事情, 就是保護(hù)bp寄存器, push bp, 保護(hù)上一個(gè)函數(shù)的地址

問(wèn)題2: 在函數(shù)內(nèi)部修改了寄存器中的值, 那么別的地方需要用到, 怎么保證數(shù)據(jù)安全呢?

  • 這就是我們所說(shuō)的破壞現(xiàn)場(chǎng)
    • 需要我們?cè)陂_(kāi)辟預(yù)留空間之后, 將寄存器push入棧, 保護(hù)寄存器
    • 在業(yè)務(wù)邏輯代碼完成之后, pop 寄存器, 將入棧的數(shù)據(jù)pop給寄存器
sum: 
      push bp
      mov bp, sp ;將sp賦值給bp寄存器,bp是專門(mén)用來(lái)代替sp進(jìn)行尋址用的寄存器
      sub sp, 20; 預(yù)留N個(gè)字節(jié)的空間給局部變量
;**************業(yè)務(wù)邏輯
      mov ss:[bp - 2], 3
      mov ss:[bp - 4], 4 ;局部變量粗如棧預(yù)留空間中
      mov ax, ss:[bp + 2]
      add ax, ss:[bp + 4]
      add ax, ss:[bp - 2]
      add ax, ss:[bp - 4] ;取出局部變量
;******************業(yè)務(wù)邏輯
      mov sp, bp ;恢復(fù)sp
      pop bp
      ret 4 ;在函數(shù)內(nèi)部 ret將下一條指令的地址pop完畢后進(jìn)行平棧, 內(nèi)平棧

以下的匯編代碼是一個(gè)函數(shù)的標(biāo)準(zhǔn)開(kāi)頭和結(jié)束

push bp
      mov bp, sp ;將sp賦值給bp寄存器,bp是專門(mén)用來(lái)代替sp進(jìn)行尋址用的寄存器
      sub sp, 20; 預(yù)留N個(gè)字節(jié)的空間給局部變量

      ..........

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

函數(shù)的調(diào)用流程

  • 1: push 參數(shù)(64位CPU 寄存器多, 不需要push入棧)
  • 2: call指令將下一條指令地址入棧
  • 3: 保護(hù)bp寄存器, mov bp, sp
  • 4: 提升sp, 作為局部變量的占空間(sp - N(N為2倍數(shù)))
  • 5: 保護(hù)寄存器,(當(dāng)外部和函數(shù)內(nèi)部都用到該寄存器時(shí))
  • 6: 業(yè)務(wù)邏輯代碼
  • 7: 恢復(fù)寄存器 pop bx
  • 8: 恢復(fù)sp mov sp, bp 或者 sp + N
  • 9: 恢復(fù)bp pop bp
  • 10: ret pop sp pop下一個(gè)指令的地址值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晾剖,隨后出現(xiàn)的幾起案子缎讼,更是在濱河造成了極大的恐慌服爷,老刑警劉巖搔弄,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件日熬,死亡現(xiàn)場(chǎng)離奇詭異携冤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秩铆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)砚亭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人殴玛,你說(shuō)我怎么就攤上這事捅膘。” “怎么了滚粟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵寻仗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凡壤,道長(zhǎng)署尤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任亚侠,我火速辦了婚禮曹体,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硝烂。我一直安慰自己箕别,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布滞谢。 她就那樣靜靜地躺著串稀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狮杨。 梳的紋絲不亂的頭發(fā)上母截,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音禾酱,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颤陶,可吹牛的內(nèi)容都是我干的颗管。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼滓走,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垦江!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起搅方,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤比吭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后姨涡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體衩藤,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年诗鸭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仰禽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叫搁。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓢剿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悠轩,我是刑警寧澤间狂,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站火架,受9級(jí)特大地震影響鉴象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜距潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一炼列、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧音比,春花似錦俭尖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至骚亿,卻和暖如春已亥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背来屠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工虑椎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留震鹉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓捆姜,卻偏偏與公主長(zhǎng)得像传趾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泥技,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 原文地址:C語(yǔ)言函數(shù)調(diào)用棧(一)C語(yǔ)言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過(guò)程可看作連續(xù)的函數(shù)調(diào)用浆兰。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,615評(píng)論 1 19
  • 8086匯編 本筆記是筆者觀看小甲魚(yú)老師(魚(yú)C論壇)《零基礎(chǔ)入門(mén)學(xué)習(xí)匯編語(yǔ)言》系列視頻的筆記玩裙,在此感謝他和像他一樣...
    Gibbs基閱讀 37,216評(píng)論 8 114
  • 你是否也和我一樣,擁有很多種愛(ài)好段直,卻未從將任何一項(xiàng)進(jìn)行深耕吃溅,將其變成自己擅長(zhǎng)的技藝?你是否也和我一樣鸯檬,在人...
    朱朱的餐具閱讀 184評(píng)論 3 8
  • 第一次代表外語(yǔ)社團(tuán)主持班會(huì)决侈,完全是邊做邊學(xué),邊學(xué)邊做喧务,會(huì)議結(jié)束后認(rèn)真反思赖歌,總結(jié)了一點(diǎn)經(jīng)驗(yàn)。 一功茴、確定工作人員庐冯,明確...
    sunny_yake閱讀 300評(píng)論 0 0
  • 一個(gè)問(wèn)題總有回答,答案肯定不止一個(gè)坎穿。 我一直相信距離會(huì)產(chǎn)生很多我們所不愿意看到的我們所不愿意認(rèn)識(shí)到的展父,因?yàn)榫嚯x不僅...
    八戒在吃葡萄干閱讀 299評(píng)論 0 0