用ss来存取参数
宋千 汇编`main:
assume cs:code,ds:data,ss:stack
;栈段(存放数据,比如高级语言中的局部变量)
stack segment
db 20 dup(0)
stack ends
;数据段(存放数据,比如高级语言中的全局变量)
data segment
db 20 dup(0)
data ends
;代码段
code segment
start:
;设置ds和ss
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
;业务逻辑代码
;参数入栈
push 1h
push 3h
push 4h
call sum
;外平栈
;add sp,6
;参数入栈
push 1h
push 3h
push 4h
call sum
;外平栈
;add sp,6
;参数入栈
push 1h
push 3h
push 4h
;外平栈
call sum
;add sp,6
;退出程序
mov ah,4ch
int 21h
;参数:传递两个字型参数,参数分别用bx,dx存放
;返回值:返回值存放在ax中
sum:
;sp要指向栈顶指针,我们不能用sp来寻址,所以大家约定俗成的用bp来专门被bp赋值,用bp在获取参数
mov bp,sp
mov ax,ss:[bp + 2]
add ax,ss:[bp + 4]
add ax,ss:[bp + 6]
;内平栈
ret 6
code ends
end start
;函数栈平衡:保证函数调用前后的栈顶是一致的
;1.外平栈:由函数外部保持栈平衡
;2.内平栈:由函数内部保持栈平衡
当然由于现在强大的硬件支持,如果参数个数小于8个很少能看见用ss来存取参数,xcode都是直接用通用寄存器来搞的。
平栈核心思想:
1.从栈中销毁局部变量:在函数ret之前,将sp指向bp的位置
2.从栈中销毁参数:内平栈 or 外平栈
网友评论