; 函數(shù)的調(diào)用流程
; 1.push參數(shù)
; 2.將函數(shù)的返回地址入棧(下一條指令的地址)
; 3.保護bp,將sp賦值給bp
; 4.分配一定的空間給局部變量使用(讓sp減去空間大小)椎侠,為了安全并使用CC填充(int 3h)
; 5.保護可能被業(yè)務代碼修改的一些寄存器
; 6.具體的業(yè)務代碼
; 7.恢復寄存器的值(跟第5步相反)
; 8.將bp賦值給sp,恢復bp
; 9.返回(ret)
所有代碼
assume cs:code, ds:data, ss:stack
; 棧段(存放數(shù)據(jù)措拇,比如高級語言中的局部變量)
stack segment
db 200 dup(0)
stack ends
; 數(shù)據(jù)段(存放數(shù)據(jù)我纪,比如高級語言中的全局變量)
data segment
db 20 dup(0)
string db 'Hello World!$'
data ends
; 代碼段
code segment
start:
; 設置ds、ss的值
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov cx, 8h
; 業(yè)務邏輯
push 3h
push 4h
call sum
mov dx, cx
; 退出程序
mov ah, 4ch
int 21h
; 參數(shù):傳遞3個字型參數(shù)丐吓,參數(shù)放到棧中
; 返回值:返回值存放到ax中
sum:
; 保護bp
push bp
mov bp, sp
sub sp, 20 ; 20字節(jié)留作局部變量的空間
; 保護寄存器
push bx
push cx
push dx
; 用int 3填充局部變量空間
;lea di, [bp - 20]
;mov cx, 10
;mov ax, 0cccch
;mov bx, ss
;mov es, bx
;rep stosw
;******** 業(yè)務邏輯代碼 begin ********
; 取出參數(shù)
; 定義一個局部變量的值是1
mov ss:[bp - 2], 1h
; 定義一個局部變量的值是2
mov ss:[bp - 4], 2h
; 修改了寄存器
mov bx, 2h
mov cx, 3h
mov dx, 4h
; 將外面?zhèn)鬟f進來的2個參數(shù)和2個局部變量相加浅悉,存儲到ax中作為返回值
mov ax, ss:[bp+2]
add ax, ss:[bp+4]
add ax, ss:[bp - 2]
add ax, ss:[bp - 4]
;******** 業(yè)務邏輯代碼 end ********
; 恢復寄存器
pop dx
pop cx
pop bx
; 恢復sp
mov sp, bp
; 恢復bp
pop bp
ret 4
code ends
end start