当前位置: 首页 > 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。


总结

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

相关文章:

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

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

前段-用面向对象的方式开发一个水管小鸟的游戏

首先准备好各类空文件 index.js css html 和图片 图片是下面这些,如果没有的可在这里下载 2 开发开始 好了,基础准备工作完毕,开发开始, 首先,先把天空,大地,小鸟的盒子准备好,并…...

Java中利用OpenCV进行人脸识别

OpenCV 概述 ​ OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,它提供了丰富的工具和算法,用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成,涵盖了许多领域,包括目…...

23111708[含文档+PPT+源码等]计算机毕业设计基于javaweb的旅游网站前台与后台旅景点

文章目录 **论文截图:****实现:****代码片段:** 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 下面是系统运行起来后的部分截图: 论文截图: 实现: 代码片段&#xf…...

Windows安装nvm【node.js版本管理工具】

目录 下载安装包 安装 配置 配置node的国内镜像源 配置npm的国内镜像源 常用命令 查看可安装的node版本 安装指定的版本 查看已有的node版本列表 切换版本 下载安装包 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11 安装 安装过程就不贴了&#xff0…...

让资产权利归于建设者:Kiosk使过程变得更简单

区块链凭借着其将人的权利地位置于平台之上的能力,可以重塑互联网,而自托管为个人提供了控制和管理其资产和数据的能力。链上交易支持建设者和客户之间的点对点交易。这些特质联合起来,可以将数字世界从基于价值提取的模式转变为基于价值创造…...

MLP感知机python实现

from torch import nn from softmax回归 import train_ch3 import torch import torchvision from torch.utils import data from torchvision import transforms# ①准备数据集 def load_data_fashion_mnist(batch_size, resizeNone):# PyTorch中的一个转换函数,它…...

Es 拼音搜索无法高亮

目录 背景: Es 版本: 第一步 第二步 (错误步骤 - 只是记录过程) 第三步 第四步 第五步 第六步 第七步 背景: app 原有的搜索功能无法进行拼音搜索,产品希望可以支持,例如内容中含有&a…...

java线性并发编程介绍-锁(二)

2.5 重量锁底层ObjectMonitor 需要去找到openjdk,在百度中直接搜索openjdk,第一个链接就是 找到ObjectMonitor的两个文件,hpp,cpp 先查看核心属性:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/69087d08d473…...

Java JPA详解:从入门到精通

描述:本文详细介绍了Java JPA的概念、使用方法以及常见问题,帮助读者从入门到精通掌握JPA。 关键词:Java JPA、Hibernate、持久层框架、ORM、数据库访问 一、Java JPA概述 Java Persistence API(JPA)是JavaEE 5规范…...

使用Open3D库处理3D模型数据的实践指南

目录 引言 一、安装Open3D库 二、加载3D模型数据 三、处理3D模型数据 1、去除模型中的无效面 2、提取模型特征 四、存储处理后的3D模型数据 五、可视化处理后的3D模型数据 六、注意事项 结论 引言 在处理3D模型数据时,Open3D库是一个功能强大且易于使用的…...

代码随想录算法训练营第五十八天丨 动态规划part18

739. 每日温度 思路 首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢? 通常是一维数组,要寻找任一个元素的右边或者左边…...

Pytest自动化测试框架介绍

1、什么是单元测试框架 单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。 2、单元测试框架主要做什么 测试发现:从多个文件里面去找到我们需要的测试用例。 测试执行:按…...

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)

公共字段自动填充 1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试 1.1 问题分析 在前面我们已经完成了后台系统的员工管理功能和菜品分类功能的开发,在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修…...

Oracle 监控的指标有哪些和oracle巡检的内容

日常监控指标: 性能指标: 查询响应时间CPU利用率内存利用率磁盘 I/O 活动网络吞吐量 空间管理: 表空间使用率数据文件增长情况Undo 表空间使用率临时表空间使用率 会话和连接: 活跃会话数等待事件监控连接数和连接池效率 数据库对…...

Uniapp有奖猜歌游戏系统源码 带流量主

有奖猜歌游戏是一款基于uni-app、uniCloud、uniAD 开发的小游戏,通过猜歌曲、观看广告赚取现金奖励。 本游戏基本特征如下: 1、玩家可以通过猜歌、做任务等方式直接获取现金奖励 2、玩家可以通过猜歌、拆红包、做任务等方式获取金币奖励,当金币累积到一定数量可以兑换现金 3…...

【算法与数据结构】前言

算法与数据结构是OI中不可或缺的一部分。 今天,让我们走进算法与数据结构独特世界。 性能 算法与数据结构都是完成任务的方法。 方法就要有性能。 有效率就有描述性能的语言。 这就是复杂度。 复杂度的描述 由于复杂度描述的是大致性能,所以采用的是…...

(六)什么是Vite——热更新时vite、webpack做了什么

vite分享ppt,感兴趣的可以下载: ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录: (一)什么是Vite——vite介绍与使用-CSDN博客 (二)什么是Vite——Vite 和 Webpack 区别&#xff0…...

贝加莱MQTT功能

贝加莱实现MQTT Client端的功能库和例程 导入库和例程,AS Logical View中分别通过Add Object—Library,Add—Program插入MQTT库和例程。 将例程Sample放置于CPU循环周期中 定义证书存放路径,在AS Physical View 中,右击PLC—Con…...

基于JavaWeb+SSM+购物系统微信小程序的设计和实现

基于JavaWebSSM购物系统微信小程序的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 第一章 绪 论 1.1选题背景 互联网是人类的基本需求,特别是在现代社会,…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...