80x86CPU入栈与出栈操作

一、栈操作:入栈push,出栈pop

栈操作:FILO(先进后出机制)

栈顶的指针:ss:sp决定,任意时刻栈顶指针指向SS:SP的位置

对于8086CPU

入栈时:sp-2

出栈时:sp+2

assume cs:code,ds:data,ss:stack
;定义数据段
data segmentdw 0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H      ;定义8个字单元的存储数据
data ends;定义栈段
stack segmentdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends;定义代码段
code segment
start:mov ax,stackmov ss,axmov sp,0020H    ;将栈顶指向stack:0020Hmov ax,datamov ds,ax       ;数据段ds指向datamov bx,0000Hmov cx,0008Hs:   push [bx]       ;将data段中0——15个内存单元中的8个字型数据入栈add bx,2loop smov bx,0mov cx,0008Hs0:   pop [bx]add bx,2loop s0         ;将以上出栈的9个字型数据出栈到data段的0——15个内存单元中mov ax,4c00H    ;调用4c00H功能中断int 21Hcode ends               ;结束code段
end start               ;结束程序

栈的空间大小:对于8086CPU,SS:SP只是确定栈顶的位置,不知道栈空间的大小,只能在写程序时安排栈空间的大小,既要防止入栈时数据太多栈顶超界,又要防止出栈时取出数据过多栈底超界。

对于以下代码寄存器的值变化

在dosbox通过debug -a 0200:0000处进行汇编操作
mov ax,1000      ;(ax)=1000
mov ss,ax        ;(ss)=1000
mov sp,0010      ;(sp)=0010,栈顶位置=((ss*16)+sp)=10010H
mov ax,1234      ;(ax)=1234
mov bx,5678      ;(bx)=5678
push ax          ;将ax入栈,栈顶位置-2=10010-2=1000EH
push bx          ;将bx入栈,栈顶位置-2=10010-2=1000CH
pop ax           ;出栈,(ax)=5678H,栈顶加2=1000CH+2=1000EH
pop bx           ;出栈,(bx)=1234H,栈顶加2=1000EH+2=10010H通过-r命令修改cs:ip寄存器的值,将指令指针指向0200:0000处开始执行汇编语句
-rcs 0200
-rip 0000-t   ;单步指行,观察寄存器ax,bx,ss,sp的值变换

二、栈操作存在的问题

栈顶越界(向上溢出)​

当栈已满时执行push操作,栈顶指针(如SP)会超出栈的合法范围,向栈外内存写入数据。例如:

在x86架构中,若栈空间为10000H~1000FH(16字节),连续执行8次push后栈满,此时SP=0(栈顶指向10010H)。若再次执行pushSP会减2至FFFEH,导致数据写入栈外地址1000EH,覆盖相邻内存区域

栈底越界(向下溢出)​

当栈为空时执行pop操作,栈顶指针会越过栈底边界,读取无效数据。例如:

空栈时SP=0020H(指向栈底下一单元),执行pop会使SP加2至0022H,后续push操作可能覆盖10020H处的数据

三、越界的底层机制与后果

​1,CPU的局限性

CPU仅跟踪栈顶指针(如x86的SS:SP),​不检测栈边界。无论越界与否,均按指令执行,导致以下风险:

数据覆盖​:越界写入可能破坏其他程序或系统数据,引发崩溃(如操作系统关键数据被篡改)。

数据泄露​:越界读取可能获取敏感信息(如密码、密钥)

​2,栈扩展方向的影响

x86栈向低地址扩展pushSP递减,pop时递增。若栈容量不足,越界操作可能覆盖代码段或堆段数据

3,​寄存器的限制

16位系统(如8086)中,SP寄存器最大值为FFFFH(64KB),若栈定义为64KB且空时执行popSP可能从0000H回绕至FFFEH,导致数据覆盖

四、解决方案与防护机制

1,程序员责任

手动管理栈容量​:预估最大栈深度(如递归深度、局部变量大小),分配足够空间

边界检查​:在关键操作前插入检查代码。例如:

; 检查栈是否已满(顺序栈示例)
cmp sp, STACK_BOTTOM
jae stack_overflow_error

​2、硬件与系统级保护

栈边界标记​:预留特定值(如0xDEADBEEF)标记栈边界,运行时检测是否被篡改

不可执行栈(NX位)​​:标记栈内存为不可执行,防止注入代码运行(常见于现代操作系统)

3、​嵌入式系统的特殊处理

在线检测机制​:在DSP等嵌入式系统中,通过中断服务程序实时监控SP位置,触发异常处理(如重启或日志记录)

多级栈保护​:结合虚拟栈帧和硬件保护环,限制栈操作范围

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最优控制:从变分法到庞特里亚金原理

典型问题 根据系统的建模可以划分为: 线性系统: x ˙ A x B u \mathbf{\dot{x}} \boldsymbol{A}\mathbf{x}\boldsymbol{B}\mathbf{u} x˙AxBu非线性系统 x ˙ ( t ) f ( x ( t ) , u ( t ) , t ) \dot{\mathbf{x}}(t) \mathbf{f}(\mathbf{x}(t)…

DeepSeek 提示词大全

目录 前言一、提示词基础理论 什么是提示词提示词的类型提示词的基本结构 二、提示词设计原则 明确指令结构化表达情境化需求渐进式引导边界与限制 三、场景化提示词模板 写作创作类角色扮演类信息提取类代码编程类教育学习类商业营销类生活助手类 四、提示词优化技巧 迭代式优…

安科瑞Acrelcloud-6200系统:智慧路灯安全用电监控平台架构解析

安科瑞顾强———Acrelgq 智慧路灯作为智慧城市与新基建的核心载体,集成了大量异元异构电子设备,其供电安全与能效管理面临电压多样、权属分散、扩展性不足等挑战。本文提出一种融合统一供电、分路计量、智能防护与远程监控的解决方案,通过构…

DMBOK对比知识点对比(1)

1.CDGP各章活动 章节一级

css设置动态数值:clamp函数

CSS 的 clamp() 函数是一个强大的工具,用于创建响应式且范围可控的动态值。它结合了min() 和max() 的逻辑,允许你定义一个值在最小值和最大值之间动态调整。 语法为: clamp(最小值, 首选值, 最大值); 工作原理: 当 …

数值计算与数据相关参数剖析:保障模型训练稳定与准确

一、计算类型:以BF16为例 1.1 核心作用 BF16 是一种计算方式,它能让模型训练更快,还省内存。比如训练模型时,用普通方式可能很慢,占内存也多,而 BF16 就像给模型开了 “加速键”,训练起来更高…

数据库读写分离解决方案

数据库读写分离解决方案 一、读写分离核心概念 读写分离(Read/Write Splitting)是通过将数据库的读操作和写操作分离到不同的数据库节点来提升系统整体性能的架构模式。 核心原则:写操作集中在主库(Master),读操作分散到从库(Slave),通过数据复制保持主从一致性 二、技术实…

小白的进阶之路系列之七----人工智能从初步到精通pytorch自动微分优化以及载入和保存模型

本文将介绍Pytorch的以下内容 自动微分函数 优化 模型保存和载入 好了,我们首先介绍一下关于微分的内容。 在训练神经网络时,最常用的算法是反向传播算法。在该算法中,根据损失函数相对于给定参数的梯度来调整参数(模型权重)。 为了计算这些梯度,PyTorch有一个内置…

【图像处理基石】立体匹配的经典算法有哪些?

1. 立体匹配的经典算法有哪些? 立体匹配是计算机视觉中从双目图像中获取深度信息的关键技术,其经典算法按技术路线可分为以下几类,每类包含若干代表性方法: 1.1 基于区域的匹配算法(Local Methods) 通过…

《Map 到底适合用哪个?HashMap、TreeMap、LinkedHashMap 对比实战》

大家好呀!今天我们来聊聊Java中超级重要的Map集合家族 🎢。Map就像是一个神奇的魔法口袋,可以帮我们把东西(值)和标签(键)一一对应存放起来。不管你是Java新手还是老司机,掌握Map都是…

TencentOSTiny

开放原子开源基金会 腾讯物联网终端操作系统 _物联网操作系统_物联网OS_TencentOS tiny-腾讯云 GitHub - OpenAtomFoundation/TobudOS: 开放原子开源基金会孵化的物联网操作系统,捐赠前为腾讯物联网终端操作系统TencentOS Tiny 项目简介 TencentOS Tiny 是腾讯…

使用 Selenium 进行自动化测试:入门指南

在现代软件开发中,自动化测试已经成为不可或缺的一部分。它不仅提高了测试效率,还减少了人为错误的可能性。Selenium 是一个强大的开源工具,广泛用于 Web 应用程序的自动化测试。本文将详细介绍如何使用 Selenium 进行自动化测试,…

C54-动态开辟内存空间

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 头文件中&#xff09; 作用&#xff1a;分配一块连续的、未初始化的内存块&#xff0c;大小为 size 字节。 返回值&#xff1a; 成功&#xff1a;返回指向分配内存首地址的 void* 指针…

ELK服务搭建-0-1搭建记录

ELK搭建 需要准备一台linux服务器&#xff08;最好是CentOS7&#xff09;,内存至少4G以上&#xff08;三个组件都比较占用内存&#xff09; 演示基于ElasticSearch采用的是8.5.0版本 1、 Docker安装Elasticsearch 创建一个网络 因为我们还需要部署kibana容器、logstash容器&am…

调参指南:如何有效优化模型训练效果

🚀 调参指南:如何有效优化模型训练效果(深度学习实战) 模型跑通不难,调得好才是本事。本篇文章将系统讲解如何在训练过程中有效调参,从学习率到网络结构,从损失函数到正则化,让你的模型效果“飞升”。 🧠 一、为什么需要调参? 初学者常常以为模型训练完就“任务完…

laya3的2d相机与2d区域

2d相机和2d区域都继承自Sprite。 2d相机必须作为2d区域的子节点&#xff0c;且2d相机必须勾选isMain才能正常使用。 2d区域下如果没有主相机&#xff0c;则他和Sprite无异&#xff0c;他的主要操作皆是针对主相机。 2d相机可以调整自己的移动范围&#xff0c;是否紧密跟随&a…

【保姆级教程】Windows部署LibreTV+cpolar实现远程影音库访问全步骤

文章目录 前言1.关于LibreTV2.docker部署LibreTV3.简单使用LibreTV4.安装cpolar内网穿透5.配置ward公网地址6.配置固定公网地址总结 前言 当周末的闲暇时光来临时&#xff0c;您是否也习惯性地瘫倒在沙发上&#xff0c;渴望通过影视作品缓解一周的疲惫&#xff1f;然而在准备点…

Windows安装Docker部署dify,接入阿里云api-key进行rag测试

一、安装docker 1.1 傻瓜式安装docker Get Docker | Docker Docs Docker原理&#xff08;图解秒懂史上最全&#xff09;-CSDN博客 官网选择好windows的安装包下载&#xff0c;傻瓜式安装。如果出现下面的报错&#xff0c;说明主机没有安装WSL 1.2 解决办法 安装 WSL | Mic…

Cursor 与DeepSeek的完美契合

这两天在看清华大学最近出的一个关于deepseek入门的官方视频中&#xff0c;看了几个deepseek的应用场景还是能够感觉到它的强大之处的&#xff0c;例如根据需求生成各种markdown格式的代码&#xff0c;再结合市面上已有的一些应用平台生成非常好看的流程图&#xff0c;PPT,报表…

【深度学习】13. 图神经网络GCN,Spatial Approach, Spectral Approach

图神经网络 图结构 vs 网格结构 传统的深度学习&#xff08;如 CNN 和 RNN&#xff09;在处理网格结构数据&#xff08;如图像、语音、文本&#xff09;时表现良好&#xff0c;因为这些数据具有固定的空间结构。然而&#xff0c;真实世界中的很多数据并不遵循网格结构&#x…