美文网首页
6.函数与栈

6.函数与栈

作者: 芝麻酱的简书 | 来源:发表于2018-08-02 15:08 被阅读6次

1.函数内局部变量的实现:
使用的栈空间,一次性给sp移动一定的距离来给局部变量预留空间
防止后面有压榨操作损坏局部变量数据

assume cs:code, ds:data, ss:stack

; 栈段
stack segment
    db 100 dup(0)
stack ends  

; 数据段
data segment  
    db 100 dup(0) 
data ends

; 代码段
code segment
start:
    ; 手动设置ds、ss的值
    mov ax, data
    mov ds, ax
    mov ax, stack
    mov ss, ax  
    
    ; 业务逻辑
    push 1
    push 2 
    call sum 
    add sp, 4 
     
    push 1
    push 2 
    call sum 
    add sp, 4   
    
    ; 退出
    mov ax, 4c00h
    int 21h 
    
; 返回值放ax寄存器
; 传递2个参数(放入栈中)    
sum:
    ; 保护bp    
    push bp
    ; 保存sp之前的值:指向bp以前的值
    mov bp, sp
    ; 预留10个字节的空间给局部变量 
    sub sp, 10  
    
    ; -------- 业务逻辑 - 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
    
    ; 访问栈中的参数
    mov ax, ss:[bp+4]
    add ax, ss:[bp+6] 
    add ax, ss:[bp-6] 
    ; -------- 业务逻辑 - end
                       
    ; 恢复sp
    mov sp, bp
    ; 恢复bp
    pop bp
    
    ret 
                
code ends  

end start

; 函数的调用流程(内存)
; 1.push 参数
; 2.push 函数的返回地址
; 3.push bp (保留bp之前的值,方便以后恢复)
; 4.mov bp, sp (保留sp之前的值,方便以后恢复)
; 5.sub sp,空间大小 (分配空间给局部变量)
; 6.执行业务逻辑
; 7.mov sp, bp (恢复sp之前的值)
; 8.pop bp (恢复bp之前的值)
; 9.ret (将函数的返回地址出栈,执行下一条指令)
; 10.恢复栈平衡 (add sp,参数所占的空间)

总结:使用push操作来保护需要保护的寄存器数据


栈帧Stack Frame Layout:

指的是一个函数执行的环境

相关文章

  • 6.函数与栈

    1.函数内局部变量的实现:使用的栈空间,一次性给sp移动一定的距离来给局部变量预留空间防止后面有压榨操作损坏局部变...

  • 普通函数与静态函数

    普通函数 普通函数为没有static关键字修饰的函数: 普通函数可以跨文件使用,调用普通函数需要经过压栈与弹栈的过...

  • LeetCode 面试题 03.02. 栈的最小值

    请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push...

  • 巧用函数栈实现栈的反转

    一、函数栈 函数的调用过程其实就是一个压栈的过程,在函数栈中,每个函数所占空间成为一个 栈帧。栈帧中保存着函数的形...

  • generate_fixed_frame() 与dispatch

    在从generate_normal_entry()函数调用generate_fixed_frame()函数时的栈与...

  • 10章 内存: 进程地址空间 / 函数调用栈 & 反汇编 / h

    1 Linux 进程地址空间 布局 2 栈 与 调用惯例 (1) 栈 & 函数调用 机制 进入 funcBody ...

  • OpenGL 栈概念及金字塔构建

    一、压栈与出栈的简介 1.压栈函数(PushMatrix()): 和数据结构中的栈类似,调用这个方法的时候,若传入...

  • ARM 读书笔记

    寄存器 内存 和 栈R0-R3 传递参数 与返回值R7 帧指针,指向母函数 与被调用字函数在栈中的交界...

  • 函数调用栈平衡

    栈平衡 栈平衡:函数调用前后的栈顶指针指向的位置不变 内平栈 外平栈 内平栈: 指的是在函数调用返回之前使栈保持...

  • 2018-07-30

    一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗...

网友评论

      本文标题:6.函数与栈

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