匯編語(yǔ)言知多少(三): 函數(shù)調(diào)用

接著上一篇文章, 這篇主要講匯編程序中函數(shù)的調(diào)用.

call 和 ret 指令: 函數(shù)的調(diào)用.

  • call 標(biāo)號(hào) : 將下一條指令的偏移地址入棧后, 轉(zhuǎn)到標(biāo)號(hào)處執(zhí)行指令
  • ret : 將棧頂?shù)闹党鰲? 賦值給 ip.

下面是代碼的一部分, 功能是 調(diào)用 print '函數(shù)', 打印字符串

; 代碼段
code segment
start:
    ; 手動(dòng)設(shè)置ds, ss 的值
    mov ax, data
    mov ds, ax
    mov ax, stack
    mov ss, ax

    ; 業(yè)務(wù)邏輯
    call print
    
    ; 程序退出
    mov ah, 4ch
    int 21h

    ; 如果這里程序不退出, 它會(huì)繼續(xù)向下執(zhí)行 print 這個(gè)函數(shù), 'print' 在這里只是相當(dāng)于一個(gè)標(biāo)志

print:
    ; ds: dx 告知字符串地址
    lea dx, string
    mov ah, 9h  ; 功能號(hào) 9h 指在屏幕上顯示字符串
    int 21h     ; 執(zhí)行 DOS 系統(tǒng)功能調(diào)用.
    ret

code ends 

end start 

我需要說(shuō)明的幾點(diǎn)

  1. call print, print 這里就是一個(gè)標(biāo)號(hào)(函數(shù)名), call 將下一條指令的偏移地址入棧后, 轉(zhuǎn)到 print 處執(zhí)行指令, 這個(gè) 下一條指令 就是 mov ah, 4ch.
  2. 當(dāng) print 處的代碼執(zhí)行完后, 每個(gè)函數(shù)都會(huì)有一個(gè) ret 指令, 這個(gè)指令會(huì)將棧頂?shù)闹党鰲? 棧頂?shù)闹稻褪?mov ah, 4ch 這條指令的偏移地址, 賦值給 ip. 導(dǎo)致 print 函數(shù)執(zhí)行完后, 可以繼續(xù)向下執(zhí)行其他的指令.

函數(shù)調(diào)用的整個(gè)流程

assume cs:code, ds:data, ss:stack

; 棧段
stack segment
    db 100 dup(0)
stack ends  

; 數(shù)據(jù)段
data segment  
    db 100 dup(0) 
data ends

; 代碼段
code segment
start:
    ; 手動(dòng)設(shè)置ds哄褒、ss的值
    mov ax, data
    mov ds, ax
    mov ax, stack
    mov ss, ax 
    
    mov si, 1
    mov di, 2
    mov bx, 3 
    mov bp, 4
    
    ; 業(yè)務(wù)邏輯
    push 1
    push 2 
    call sum 
    add sp, 4 
    
    ; 退出
    mov ax, 4c00h
    int 21h 
    
; 返回值放ax寄存器
; 傳遞2個(gè)參數(shù)(放入棧中)    
sum:
    ; 保護(hù)bp    
    push bp
    ; 保存sp之前的值:指向bp以前的值
    mov bp, sp
    ; 預(yù)留10個(gè)字節(jié)的空間給局部變量 
    sub sp, 10
    
    ; 保護(hù)可能會(huì)用到的寄存器
    push si
    push di
    push bx 
    
    ; 給局部變量空間填充int 3(CCCC)
    ; stosw的作用:將ax的值拷貝到es:di中,同時(shí)di的值會(huì)+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í)行某個(gè)指令(執(zhí)行次數(shù)由cx決定)
     
    ; -------- 業(yè)務(wù)邏輯 - begin
    ; 定義2個(gè)局部變量
    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 
    
    ; 訪問(wèn)棧中的參數(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 
                
code ends  

end start

說(shuō)明

  • 1.push 參數(shù)
  • 2.push 函數(shù)的返回地址
  • 3.push bp (保留bp之前的值嚼沿,方便以后恢復(fù))
  • 4.mov bp, sp (保留sp之前的值匀们,方便以后恢復(fù)), SP 棧頂指針寄存器, BP, 基址指針寄存器
  • 5.sub sp,空間大小 (分配空間給局部變量)
  • 6.保護(hù)可能要用到的寄存器
  • 7.使用CC ( int 3) 填充局部變量的空間
  • 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ù)所占的空間)
    • 棧平衡: 函數(shù)調(diào)用前后的棧頂指針要一致. 棧如果不平衡, 椕2兀空間遲早會(huì)被用完.
    • 棧平衡分內(nèi)平棧 和 外平棧

棧幀 (Stack Frame Layout)

棧幀是一個(gè)函數(shù)執(zhí)行的環(huán)境, 包括參數(shù), 局部變量, 返回地址

  • 由 下 到 上地址逐漸減小
  • 棧幀 3 調(diào)用 棧幀2, 棧幀2 調(diào)用 棧幀 1, 棧幀1 執(zhí)行完后, 被釋放, SP, BP 逐漸增大

注意: 方向和上面是相反的.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末休弃,一起剝皮案震驚了整個(gè)濱河市盅抚,隨后出現(xiàn)的幾起案子房待,更是在濱河造成了極大的恐慌怔球,老刑警劉巖嚼酝,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竟坛,居然都是意外死亡闽巩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)流码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)又官,“玉大人,你說(shuō)我怎么就攤上這事漫试×矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵驾荣,是天一觀的道長(zhǎng)外构。 經(jīng)常有香客問(wèn)我,道長(zhǎng)播掷,這世上最難降的妖魔是什么审编? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮歧匈,結(jié)果婚禮上垒酬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好勘究,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布矮湘。 她就那樣靜靜地躺著,像睡著了一般口糕。 火紅的嫁衣襯著肌膚如雪缅阳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天景描,我揣著相機(jī)與錄音十办,去河邊找鬼。 笑死超棺,一個(gè)胖子當(dāng)著我的面吹牛向族,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播说搅,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炸枣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了弄唧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霍衫,失蹤者是張志新(化名)和其女友劉穎候引,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體敦跌,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澄干,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柠傍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麸俘。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惧笛,靈堂內(nèi)的尸體忽然破棺而出从媚,到底是詐尸還是另有隱情,我是刑警寧澤患整,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布拜效,位于F島的核電站,受9級(jí)特大地震影響各谚,放射性物質(zhì)發(fā)生泄漏紧憾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一昌渤、第九天 我趴在偏房一處隱蔽的房頂上張望赴穗。 院中可真熱鬧,春花似錦、人聲如沸般眉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)煤篙。三九已至斟览,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辑奈,已是汗流浹背苛茂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸠窗,地道東北人妓羊。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稍计,于是被迫代替她去往敵國(guó)和親躁绸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(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,612評(píng)論 1 19
  • 8086匯編 本筆記是筆者觀看小甲魚(yú)老師(魚(yú)C論壇)《零基礎(chǔ)入門(mén)學(xué)習(xí)匯編語(yǔ)言》系列視頻的筆記大审,在此感謝他和像他一樣...
    Gibbs基閱讀 37,216評(píng)論 8 114
  • 1.地址總線蘸际,數(shù)據(jù)總線,控制總線在哪里徒扶,它們有什么作用?答:它們都是cpu連接外部組件的線路粮彤。地址總線:地址總線A...
    MagicalGuy閱讀 1,457評(píng)論 0 1
  • 計(jì)算機(jī)通過(guò)執(zhí)行指令序列來(lái)使機(jī)器得以工作,所以對(duì)于每一系列的計(jì)算機(jī)都有指定的一組指令集供計(jì)算機(jī)使用酷愧,這組指令...
    未來(lái)科技工作室閱讀 7,994評(píng)論 1 10
  • 往樓下一瞥 樹(shù)葉蔫蔫的 耷拉著腦袋 像委屈的小孩 灰塵四處亂竄 ? 但它休想擠進(jìn)我的空調(diào)房 只有那披著鐵皮奔跑的甲...
    Zizer閱讀 83評(píng)論 0 0