美文网首页程序员
汇编学习笔记 - 栈平衡 (8086)

汇编学习笔记 - 栈平衡 (8086)

作者: sqatm | 来源:发表于2018-04-17 01:58 被阅读111次

    用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 外平栈

    相关文章

      网友评论

        本文标题:汇编学习笔记 - 栈平衡 (8086)

        本文链接:https://www.haomeiwen.com/subject/hcgykftx.html