【汇编语言】第三章----寄存器(内存访问)(八)—— 栈顶越界的问题

文章目录

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

怎样会造成栈顶越界

我们现在知道,8086CPU用SS和SP指示栈顶的地址,并提供push和pop指令实现入栈和出栈。

但是,还有一个问题需要讨论,就是SS和SP只是记录了栈顶的地址,依靠SS和SP可以保证在入栈和出栈时找到栈顶。可是,如何能够保证在入栈、出时,顶不会超出栈空间?

当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。

(1)图1 描述了在执行 push 指令后,栈顶超出栈空间的情况。

上图中,当SS:SP指向1000EH,栈顶超出了栈空间,ax中的数据送入1000EH单元处,将栈空间外的数据覆盖。

(2)图2 描述了在执行 pop指令后,栈顶超出栈空间的情况。

上图中,当SS:SP指向10022H,栈顶超出了栈空间。此后,如果再执行 push 指令,10020H、10021H中的数据将被覆盖。

对于栈顶越界的看法与建议

看法:

❗❗❗栈顶超界是危险的:

因为我们既然将一段空间安排为栈 ,那么在栈空间之外的空间里很可能存放了具有其他用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的(毕竟一个计算机系统并不是只有我们自己的程序在运行)。但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。(但如果是刻意的......那么......呵呵......)




我们当然希望CPU 可以帮我们解决这个问题,比如说在CPU中有记录栈顶上限和下限的寄存器,我们可以通过填写这些寄存器来指定栈空间的范围 ,然后 ,CPU 在执行push指令的时候靠检测栈顶上限寄存器,在执行pop 指令的时候靠检测栈顶下限寄存器保证不会超界。实际情况:8086CPU中并没有这样的寄存器。

8086CPU不保证对栈的操作不会超界。这就是说, 8086CPU 只知道栈顶在何处(由SS:SP指示),而不知道读者安排的栈空间有多大。这点就好像 ,CPU 只知道当前要执行的指令在何处(由CS:SP指示)而不知道读者要执行的指令有多少。从这两点我们可以看出8086CPU的工作机理,只考虑当前的情况:

  • 当前栈顶在何处
  • 当前要执行的指令是哪一条

建议: 我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界; 执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

相关推荐
辛苦才能3 分钟前
C++多态原理:虚函数表的内存布局与动态绑定的汇编真相
开发语言·c++
Sirens.5 分钟前
MySQL数据库:JDBC编程
数据库·mysql
铲灰6 分钟前
做个总结而已
开发语言
IvanCodes14 分钟前
Python 文件操作(十二):文件与目录的读写
开发语言·python
右耳朵猫AI16 分钟前
Java周刊2026W38 | Micronaut 修补三漏洞、JDK 27 提速 54%、Jetty 修复抖动测试
java·后端·spring
事已至此先睡覺吧17 分钟前
第二篇:Java 基础语法:变量、数据类型、运算符与类型转换
java
YOLO_DATA17 分钟前
无人机高速公路道路缺陷数据集 道路损伤数据集 公路裂缝识别 AI大疆数据集 10798期
人工智能·深度学习·yolo·机器学习·cnn
蓝速科技25 分钟前
会议室门牌签到功能选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
Wang's Blog27 分钟前
Java 项目实战: 外卖平台-后台退出功能与首页iframe架构
java·服务器·redis
Wang's Blog28 分钟前
Java 项目实战: 外卖平台-软件开发流程与项目整体介绍
java·服务器·redis