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

先上代码

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一篇前言 这是一系列的汇编语言学习的读书笔记,以及一些自己的理解系列文章。我想我会在循序渐进的学习中,写下对汇编的...
    华落阅读 5,245评论 1 1
  • 东风吹落玉池莲,人间天庭锦满园。九曲桥边如意树,万枝千朵祝平安。
    江南烟雨阅读 270评论 1 13
  • 慢慢合上防盗门之后,罗睢浩脱下了那双他怎么也刷不干净的黑色帆布鞋,然后轻轻迈入客厅。 外面已经很黑了,只有客厅的电...
    罗荼阅读 421评论 1 1
  • 素描课从昨天下午两点至七点半,没有过程图,没想起来拍。中间有老师示范,还有自己画的时间,五个半小时,虽然最后注意力...
    雪时阅读 157评论 0 0
  • 文/梅晓珠 本文选自梅晓珠的原创基地 小董下班回来说:单位新同事请吃饭,不知道该不该去。 我飞舞着手指,从电脑前抬...
    蒋珠莉阅读 819评论 9 33