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

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位置,触发异常处理(如重启或日志记录)

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

相关文章:

  • 软考-系统架构设计师-第十章 系统质量属性和架构评估
  • 系统安装出现的问题 老毛桃
  • 算法训练第二天
  • FEMFAT许可的有效期限
  • “谁能进,谁不能进?”——用NAC精准控制网络访问
  • 痉挛性斜颈的健康护理要点:从日常管理到康复辅助
  • CSS--background-repeat详解
  • 【第4章 图像与视频】4.4 离屏 canvas
  • 手机实名认证接口如何用C#进行调用?
  • Linux环境下多进程Socket通信实现
  • 学习路之PHP--easyswoole操作数据库
  • 性能测试工具选型指南
  • UNICEODE_STRING
  • 【Markdown基础语法】
  • Oracle/openGauss中,DATE/TIMESTAMP与数字日期/字符日期比较
  • 黑马点评项目02——商户查询缓存(缓存穿透、缓存雪崩、缓存击穿)以及细节
  • 解析C++排序算法
  • vue-seamless-scroll 结束从头开始,加延时后滚动
  • 影楼精修-AI追色算法解析
  • 定点小数 不需要指数部分 不采用移码
  • 襄阳建设局网站/全自动引流推广软件
  • 经常浏览不良网站会被记录吗/搜易网托管模式的特点
  • 开发网站公司名称/网络营销在哪里学比较靠谱
  • 做淘客网站哪个cms好/兰蔻搜索引擎营销案例
  • 上海网站公安备案/怎么做好网站方式推广
  • 9e做网站/湖南省人民政府