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

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.xdnf.cn/news/9753.html

相关文章:

  • C++:lambda匿名函数
  • 【VSCode-Qt】Docker远程连接的项目UI文件在 VSCode 上无法预览
  • STM32F407VET6学习笔记8:UART5串口接收中断的Cubemx配置
  • Spring 面经
  • PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
  • 5.LoadBalancer负载均衡服务调用
  • 【测试】Bug和用例
  • 视觉分析开发范例:Puppeteer截图+计算机视觉动态定位
  • 国内连接速度较快的常用 Yum 源及其具体配置方法
  • mysql一主多从 k8s部署实际案例
  • 【C++项目】:仿 muduo 库 One-Thread-One-Loop 式并发服务器
  • 什么是VR全景相机?如何选择VR全景相机?
  • http传输协议的加密
  • 黑马点评项目02——商户查询缓存(缓存穿透、缓存雪崩、缓存击穿)以及细节
  • 有关于常量的一节知识
  • JAVA学习 DAY1 初识JAVA
  • 生成式引擎的认知霸权:为什么传统内容失效?
  • 【AI非常道】二零二五年三月,AI非常道
  • 黑马程序员C++核心编程笔记--1 程序的内存模型
  • AniGS - 基于单张图像的动态高斯化身重建
  • 62、【OS】【Nuttx】编码规范解读(十)
  • 电缆中性点概念
  • webstrorm 提示(This file does not belong to the project)此文件不属于该项目
  • 深度学习-模型训练的相关概念
  • 【spring】spring中的retry重试机制; resilience4j熔断限流教程;springboot整合retry+resilience4j教程
  • java中自定义注解
  • WildDoc:拍照场景下的文档理解——数据真香
  • ETL怎么实现多流自定义合并?
  • 信奥之计算原理与排列组合
  • 人工智能在智慧物流中的创新应用与未来趋势