美文网首页
汇编-8086 栈平衡,call和ret使用

汇编-8086 栈平衡,call和ret使用

作者: 梦醒了i77 | 来源:发表于2020-03-25 00:39 被阅读0次

先上代码

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

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

:数据段
data segment 
   db 100 dup(0)
   string db 'Hello!$'
data ends

:代码段
code segment 

start:
         
    mov ax, data
    mov dx, ax
    mov ax, stack
    mov ss, ax      
    
    :调用函数   
    push word ptr offset string    
    call print
    add sp, 2    
    
    push 1111h
    push 2222h
    call count
    add sp, 4
    push ax  
    call print
    add sp, 2

    

    
    mov ax, 4c00h
    int 21h    
    
count:         

    mov bp, sp

    mov ax, ss:[bp+2]
    mov bx, ss:[bp+4]
    add ax, bx
    ret    
    
print:
    mov bp, sp
    mov dx, ss:[bp+2]
    mov ah, 9h
    int 21h
    ret 
             
code ends 

end start

开始分析

push word ptr offset string 

将在数据段中的字符串Hello!的位置push到栈中($:代表结束,offset在数据段的偏移量

call print

会转到print
同时会把下一条指令的偏移地址push到栈中

bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址

sp是栈顶指针,它每次指向栈顶。

mov bp, sp

mov ax, ss:[bp+2]
mov bx, ss:[bp+4]
add ax, bx

ret

然后 ret会将ip指向到栈顶,也就是call push进来的偏移地址(ip就是下一条处理的地址

默认做法返回值会赋值给ax

为了保证栈平衡,调用完一个函数之后sp会加传进去的参数长度

也就是将栈顶恢复到调用这个方法之前的位置

1585038202(1).png

相关文章

  • 汇编-8086 栈平衡,call和ret使用

    先上代码 开始分析 将在数据段中的字符串Hello!的位置push到栈中($:代表结束,offset在数据段的偏移...

  • 8086汇编(17)call和ret

    call和ret指令 1、call标号 将下一条指令的偏移地址入栈后 转到标号处执行指令 2、 ret将栈顶的值出...

  • 汇编-----栈的平衡 && 现场保护

    汇编中使用call指令的时候, 需要注意栈的平衡 函数栈平衡, 保证函数调用前后,sp是一致的 1.外平栈: 由函...

  • 汇编- call和ret

    尽管这两条指令看起来很简单,但是很多初学者并不能完全领会这两条指令的本质。所以我把它们作为一个单独的章节来介绍,我...

  • call和ret

    call指令和ret指令 call 标号:将下一条指令的偏移地址入栈后转到标号处执行指令 ret:将栈顶的值出栈,...

  • 【8086汇编】-- call 和 ret 指令 的应用和本质

    在高级语言开发中会把一些功能封装成方法然后调用,下面我们来用汇编实现一个打印hello world的方法 先实现打...

  • 8086 汇编之函数调用

    一、 8086 汇编之函数调用栈平衡 栈平衡:函数调用前后,栈顶指针指向同一个位置如果不指向同一个位置则说明有内存...

  • 学习汇编--写一个完整的汇编(二)

    call指令和ret指令 call 标号 执行方式将吓一条指令的地址入栈跳转到定位的地址执行指令 ret 将栈顶的...

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

    用ss来存取参数 当然由于现在强大的硬件支持,如果参数个数小于8个很少能看见用ss来存取参数,xcode都是直接用...

  • 8086汇编(25)ret和retf

    ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移; retf指令用栈中的数据,修改CS和I...

网友评论

      本文标题:汇编-8086 栈平衡,call和ret使用

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