一、栈操作:入栈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
)。若再次执行push
,SP
会减2至FFFEH
,导致数据写入栈外地址1000EH
,覆盖相邻内存区域
栈底越界(向下溢出)
当栈为空时执行pop操作,栈顶指针会越过栈底边界,读取无效数据。例如:
空栈时SP=0020H
(指向栈底下一单元),执行pop
会使SP
加2至0022H
,后续push
操作可能覆盖10020H
处的数据
三、越界的底层机制与后果
1,CPU的局限性
CPU仅跟踪栈顶指针(如x86的SS:SP
),不检测栈边界。无论越界与否,均按指令执行,导致以下风险:
数据覆盖:越界写入可能破坏其他程序或系统数据,引发崩溃(如操作系统关键数据被篡改)。
数据泄露:越界读取可能获取敏感信息(如密码、密钥)
2,栈扩展方向的影响
x86栈向低地址扩展,push
时SP
递减,pop
时递增。若栈容量不足,越界操作可能覆盖代码段或堆段数据
3,寄存器的限制
16位系统(如8086)中,SP
寄存器最大值为FFFFH
(64KB),若栈定义为64KB且空时执行pop
,SP
可能从0000H
回绕至FFFEH
,导致数据覆盖
四、解决方案与防护机制
1,程序员责任
手动管理栈容量:预估最大栈深度(如递归深度、局部变量大小),分配足够空间
边界检查:在关键操作前插入检查代码。例如:
; 检查栈是否已满(顺序栈示例)
cmp sp, STACK_BOTTOM
jae stack_overflow_error
2、硬件与系统级保护
栈边界标记:预留特定值(如0xDEADBEEF
)标记栈边界,运行时检测是否被篡改
不可执行栈(NX位):标记栈内存为不可执行,防止注入代码运行(常见于现代操作系统)
3、嵌入式系统的特殊处理
在线检测机制:在DSP等嵌入式系统中,通过中断服务程序实时监控SP
位置,触发异常处理(如重启或日志记录)
多级栈保护:结合虚拟栈帧和硬件保护环,限制栈操作范围