assume cs:code,ds:data,ss:stack
;棧段(存放數(shù)據(jù)剪廉,比如高級語言中的局部變量)
stack segment
db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment
db 20 dup(0)
str db "Hello World!$"
data ends
;代碼段
code segment
start:
;設置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;業(yè)務邏輯代碼
push 3h ;傳遞參數(shù)
push 4h
call sum
;add sp,6
;退出程序
mov ah,4ch
int 21h
;參數(shù):傳遞兩個字型參數(shù)庆械,參數(shù)分別用bx褂萧,dx存放
;返回值:返回值存放在ax中
sum:
;保護bp
push bp
mov bp,sp
sub sp,20 ;20字節(jié)留作局部變量
;保護寄存器
push bx
push cx
push dx
;*****************業(yè)務邏輯代碼
;定義兩個局部變量
mov ss:[bp - 2],1h
mov ss:[bp - 4],2h
;修改寄存器
mov bx,2h
mov cx,3h
mov dx,4h
mov ax,ss:[bp + 2]
add ax,ss:[bp + 4]
add ax,ss:[bp - 2]
add ax,ss:[bp - 4]
;*****************業(yè)務邏輯代碼
;恢復寄存器
pop dx
pop cx
pop bx
;恢復sp
mov sp,bp
;恢復bp
pop bp
ret 4
code ends
end start
;函數(shù)棧平衡:保證函數(shù)調用前后的棧頂是一致的
;1.外平棧:由函數(shù)外部保持棧平衡
;2.內平棧:由函數(shù)內部保持棧平衡
;int sum(int a, int b)
;{
; int c = 1;
; int d = 2;
; return a + b + c + d;
;}
;函數(shù)的調用流程
;1.push參數(shù)(64位cpu 任性使用寄存器)
;2.call指令調用(將下一條指令地址入棧)
;3.保護bp寄存器,將sp賦值給bp
;4.提升sp指針哈打,作為局部變量空間(sp 減去值)
;5.保護寄存器
;6.業(yè)務邏輯
;7.恢復寄存器
;8.恢復sp(sp指向bp/sp 加上值)
;9.恢復bp(pop bp)
;10.返回(ret)