一、棧操作:入棧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
位置,觸發異常處理(如重啟或日志記錄)
?多級棧保護?:結合虛擬棧幀和硬件保護環,限制棧操作范圍