棧平衡
- 棧平衡:函數(shù)調(diào)用前后的棧頂指針指向的位置不變
內(nèi)平棧 外平棧
- 內(nèi)平棧: 指的是在函數(shù)調(diào)用返回之前使棧保持平衡(一般使用寄存器傳參一般都是內(nèi)平棧)
- 外平棧:在函數(shù)調(diào)用后通過操作使棧保持平衡 (一般使用棧傳參的是外平棧)
函數(shù)的調(diào)用流程 (使用棧傳參)
- push參數(shù)
- push函數(shù)的返回地址
- push bp (保留bp之前的值胡嘿,方便以后恢復(fù)bp的值)
- mov bp, sp (保留sp之前的值,方便以后恢復(fù)sp)
- sub sp, 空間大小 (分配空間給函數(shù)內(nèi)部的局部變量使用)
- 保護可能用到的寄存器
- 填充局部變量的的空間
- 執(zhí)行業(yè)務(wù)邏輯
- 恢復(fù)寄存器之前的值
- mov sp, bp (恢復(fù)sp之前的值)
- pop bp (恢復(fù)bp之前的值)
- ret (將函數(shù)的返回地址出棧,執(zhí)行下一條指令)
- 恢復(fù)站平衡 (add sp, 參數(shù)占用的空間)
- sp 寄存器:棧頂?shù)膬?nèi)存地址
- bp 寄存器:輔助sp寄存器的寄存器
- sp 指向棧頂
- 方法結(jié)束后又要指向棧里面的函數(shù)返回地址
- 需要一個記錄員 當(dāng)sp不指向棧里面的函數(shù)返回地址 時記錄下sp當(dāng)前的位置
- 所以當(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
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者