当前位置: 首页 > news >正文

【汇编】栈及栈操作的实现

文章目录

  • 前言
  • 一、栈是什么?
  • 二、栈的特点
  • 三、栈操作
  • 四、8086cpu操作栈
    • 4.1 汇编指令
    • 4.2 汇编代码讲解
      • 问题:
      • 回答:
    • 4.3 栈的操作
    • 4.3 push 指令和pop指令的执行过程
      • 执行入栈(push)时,栈顶超出栈空间
      • 执行出栈(pop)时,栈顶超出栈空间
      • 栈顶超界问题的解决
    • 4.4 栈的小结
  • 总结


前言

在计算机编程的世界中,了解底层的硬件运作是非常重要的。而汇编语言作为一种低级语言,直接与计算机的硬件打交道,其核心概念之一就是栈及栈操作。栈不仅是一种数据结构,更是函数调用、数据保存和程序执行的关键工具。在这篇文章中,我们将深入探讨汇编语言中栈的概念,以及如何通过栈操作来实现各种重要的编程任务。通过理解栈,我们将更好地理解计算机程序的底层运作原理,提高编程的深度和效率。


一、栈是什么?

想象一下你有一堆盘子,你每次都把新的盘子放在上面,取的时候总是从最上面拿。这种像是一摞盘子的结构就像计算机中的栈。栈是一种数据结构,数据像是一层一层的盘子,最新的数据放在最上面。

二、栈的特点

后进先出(Last In, First Out,LIFO): 就像盘子一样,最后放上去的先被拿走,因为新的数据总是放在栈的顶部。

只能在栈顶操作: 想象一下你只能在盘子堆的顶部放置或拿取盘子,不能在中间或底部进行操作。栈也是这样,只能在栈顶进行数据的读取和写入。

三、栈操作

在计算机中,栈常常用于保存和管理函数调用时的数据。两个主要的栈操作是 入栈(Push) 和 出栈(Pop)。

入栈(Push): 就像往盘子堆中放一个新的盘子一样,将数据放到栈顶。

出栈(Pop): 就像从盘子堆中拿走最上面的盘子一样,取出栈顶的数据。

举个例子,假设你在玩一个游戏,每个关卡的进度都需要保存,你可以把每个关卡的进度入栈。当你完成一个关卡时,就可以出栈,回到上一个关卡的进度。

在计算机编程中,函数的调用和返回通常也使用栈来管理,保证程序能够正确地跳回到之前的执行点。栈在计算机中有着广泛的运用,它提供了一种简单而有效的数据管理方式。

四、8086cpu操作栈

4.1 汇编指令

PUSH(入栈)和 POP(出栈)指令
push ax:将ax中的数据送入栈中
pop ax:从栈顶取出数据送入ax
(以字为单位对栈进行操作)

4.2 汇编代码讲解

assume cs:codesg
codesg segmentmov ax,0123Hpush axmov ax,4567Hpush axpop axpop axmov ax,4c00hint 21hcodesg ends
end

问题:

1、CPU如何知道一段内存空间被当作栈使用?
2、执行push和pop的时候,如何知道哪个单元是栈顶单元?

回答:

8086CPU中,有两个与栈相关的寄存器:
栈段寄存器SS - 存放栈顶的段地址
栈顶指针寄存器SP - 存放栈顶的偏移地址
——任意时刻,SS:SP指向栈顶元素。

4.3 栈的操作

mov ax, 1000H
mov ss, ax
mov sp, 0010H

在这里插入图片描述

在这里插入图片描述

mov ax, 001AH
mov bx, 001BH

在这里插入图片描述

push ax
push bx

在这里插入图片描述
在这里插入图片描述

pop ax
pop bx

在这里插入图片描述

4.3 push 指令和pop指令的执行过程

push ax
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的
单元,以当前栈顶下面的单元为新的栈顶。
栈顶超界问题
如何能够保证在入栈、出栈时,栈顶不会超出栈空间?

执行入栈(push)时,栈顶超出栈空间

在这里插入图片描述

执行出栈(pop)时,栈顶超出栈空间

在这里插入图片描述

栈顶超界问题的解决

8086CPU不保证对栈的操作不会超界。8086CPU 只知道栈顶在何处(由SS:SP指示),不知道程序安排的栈空间有多大。我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;防止出栈时栈空了仍然继续出栈而导致的超界

4.4 栈的小结

push、pop 实质上就是一种内存传送指令,可以在寄存器和内存
之间传送数据,与mov指令不同的是,push和pop指令访问的内
存单元的地址不是在指令中给出的,而是由SS:SP指出的。
执行push和pop指令时,SP 中的内容自动改变。
8086CPU提供的栈操作机制:
在SS,SP中存放栈顶的段地址和偏移地址,入栈和出栈指
令根据SS:SP指示的地址,按照栈的方式访问内存单元。
push指令的执行步骤:
1)SP=SP-2;
2)向SS:SP指向的字单元中送入数据。
pop指令的执行步骤:
1)从SS:SP指向的字单元中读取数据;
2)SP=SP-2。


总结

汇编语言中的栈及栈操作是程序执行过程中至关重要的组成部分。栈的结构和其操作方式直接影响着函数的调用、数据的保存和程序的执行流程。通过入栈和出栈的操作,我们能够实现数据的临时存储与恢复,实现函数的嵌套调用以及处理各种编程任务。总体而言,深入理解栈及栈操作对于汇编语言的学习和实际编程有着重要的意义。通过本文的讨论,希望读者能够对汇编语言中栈的角色和操作有更清晰的认识,并能够运用这些知识更加灵活地进行编程。

http://www.lryc.cn/news/233961.html

相关文章:

  • 前段-用面向对象的方式开发一个水管小鸟的游戏
  • Java中利用OpenCV进行人脸识别
  • 23111708[含文档+PPT+源码等]计算机毕业设计基于javaweb的旅游网站前台与后台旅景点
  • Windows安装nvm【node.js版本管理工具】
  • 让资产权利归于建设者:Kiosk使过程变得更简单
  • MLP感知机python实现
  • Es 拼音搜索无法高亮
  • java线性并发编程介绍-锁(二)
  • Java JPA详解:从入门到精通
  • 使用Open3D库处理3D模型数据的实践指南
  • 代码随想录算法训练营第五十八天丨 动态规划part18
  • Pytest自动化测试框架介绍
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)
  • Oracle 监控的指标有哪些和oracle巡检的内容
  • Uniapp有奖猜歌游戏系统源码 带流量主
  • 【算法与数据结构】前言
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • 贝加莱MQTT功能
  • 基于JavaWeb+SSM+购物系统微信小程序的设计和实现
  • 为什么需要Code Review?
  • 【计算机网络笔记】ICMP(互联网控制报文协议)
  • Git教程1:生成和提交SSH公钥到远程仓库
  • 贝茄莱BR AS实时数据采集功能
  • Git的基本操作以及原理介绍
  • 2023安全与软工顶会/刊中区块链智能合约相关论文
  • word文档转换为ppt文件,怎么做?
  • 机器视觉选型-什么时候用远心镜头
  • quartz笔记
  • ER 图是什么
  • PLC电力载波通讯,一种新的IoT通讯技术