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

文章目录

前言

📌

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

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以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主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

相关推荐
神仙别闹8 分钟前
基于java的改良版超级玛丽小游戏
java
Dream_Snowar17 分钟前
速通Python 第三节
开发语言·python
你的微笑,乱了夏天20 分钟前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭31 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺31 分钟前
分布式系统架构:服务容错
数据库·架构
海棠AI实验室33 分钟前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
暮湫1 小时前
泛型(2)
java
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石1 小时前
12/21java基础
java