汇编语言:栈相关知识点


前言

本文记录汇编语言中栈的概念和内容

一、概念

栈在汇编语言中,被定义为一段连续的内存单元
与数据结构类似,有数据入栈,出栈和栈顶的概念,但是在汇编语言中,我们可以直接接触到栈顶,也就是有相关标记表明栈顶的存在

二、栈

1.数据

在汇编语言中,入栈push和出栈pop可以对数据进行操作,这里进行操作的数据有如下的特征

  • 数据从寄存器和内存中来
  • 数据是字型数据,操作的是16位寄存器或内存中的字型数据
入栈

16位寄存器或内存中的字型数据放到栈顶标记的上方
修改栈顶标记

出栈

将栈顶标记的字型数据 放到16位寄存器或内存中
修改栈顶标记

从上面我们可以看出,栈顶标记本质是一个内存地址,往栈(连续内存区域中)写入和拿出数据,都是针对相关内存地址进行修改;而在8086CPU中,在任意时刻,将段地址寄存器SS偏移地址寄存器SP所组合出来的内存地址当作栈顶标记!

2.指令

push

push ax 所做的事情如下
修改SP寄存器中的数值:SP=SP-2
将AX中的字型数据->放到SS:SP所组合的内存地址中,入栈

pop

pop bx
将SS:SP所组合出的内存地址中的字型数据->bx
修改栈顶标记 SP=SP+2,出栈

3.设置

所谓栈所占据的空间,无非就是栈的起始地址和栈顶标记所在位置之间的距离

例如以下代码

mov ax,2000
mov ss,ax
mov ss,2000

mov sp,16
push ax

mov ax,2233
push ax
push ax 
push ax

pop bx
pop cx
pop dx

这段代码便将栈的起始位置的段地址设置为2000,且将栈顶的偏移地址设置为16,这种情况下,栈中支持存储的字型数据为8个

通常,将栈设定位为16的倍数

4.栈顶越界

当push入栈数据大小或者pop出栈数据大小大于栈顶标记与栈的起始地址所组成的栈空间时,便会发生栈顶越界问题,但汇编语言并不会像其他高级语言那样直接抛出异常和错误

汇编语言在任意时刻,都会将ss:sp所组成的地址认为为栈顶标记

例如以下情况
在这里插入图片描述
在这段代码中,可以清楚地看到sp寄存器中的数值减到0后会跳转至FFFE,而这段存储空间所存储的指令或数据我们不得而知,也就是说,在汇编语言中,虽然栈顶越界不会带来直接的异常错误,但如果我们通过push或者pop破坏我们原已有的指令或者数据,也是十分致命的

从以上我们可以看到,SP寄存器的变化范围为0~FFFFH,也就是65536个字节,32768个字型数据,也就是我们原来所说的64KB

5.栈的作用

主要作用

栈的主要作用:临时性地保存数据

在call指令和ret指令中,call转移指令临时地将吓一跳指令所在的地址保存了栈中栈顶位置,再通过ret指令从栈顶将保存的指令拿出

临时作用
  • 用于数据交换
    例:
mov ax,1122
mov bx,3344
push ax
push bx
pop ax
pop bx
mov ax,1000H
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[0]
pop ds:[2]
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言程序设计主要涉及以下知识点: 1. 寄存器:在汇编语言中,寄存器是用来存储和处理数据的临时存储器。常见的寄存器有通用寄存器(如AX、BX、CX、DX等),以及特殊用途寄存器(如程序计数器PC、标志寄存器FLAGS等)。 2. 指令集:汇编语言中的指令集是一组用于执行特定操作的机器指令,如数据传输指令、算术运算指令、逻辑运算指令、控制转移指令等。 3. 内存管理:汇编语言程序使用内存来存储数据和指令。了解如何访问和管理内存是非常重要的,包括使用地址和偏移量访问内存单元,以及使用来进行函数调用和局部变量的存储。 4. 标志位和条件转移:在汇编语言中,通过设置和检查标志位来实现条件判断和控制流转。条件转移指令根据标志位的状态来决定是否进行跳转操作。 5. 子程序和函数调用:汇编语言中使用子程序或函数进行代码的模块化和复用。了解如何定义和调用子程序,以及参数传递和返回值的处理是必要的。 6. 输入输出:汇编语言程序可以与外部设备进行交互,包括从键盘接收输入、向屏幕输出字符、读写文件等操作。 7. 中断处理:汇编语言程序可以响应硬件中断或软件中断。了解如何设置中断向量表、处理中断请求,并进行相应的中断处理程序编写是重要的。 这些是汇编语言程序设计中的基本知识点,掌握这些知识可以帮助你编写和理解汇编语言程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值