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.pswp.cn/web/81740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81740.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最優控制:從變分法到龐特里亞金原理

典型問題 根據系統的建模可以劃分為: 線性系統: x ˙ A x B u \mathbf{\dot{x}} \boldsymbol{A}\mathbf{x}\boldsymbol{B}\mathbf{u} x˙AxBu非線性系統 x ˙ ( t ) f ( x ( t ) , u ( t ) , t ) \dot{\mathbf{x}}(t) \mathbf{f}(\mathbf{x}(t)…

DeepSeek 提示詞大全

目錄 前言一、提示詞基礎理論 什么是提示詞提示詞的類型提示詞的基本結構 二、提示詞設計原則 明確指令結構化表達情境化需求漸進式引導邊界與限制 三、場景化提示詞模板 寫作創作類角色扮演類信息提取類代碼編程類教育學習類商業營銷類生活助手類 四、提示詞優化技巧 迭代式優…

安科瑞Acrelcloud-6200系統:智慧路燈安全用電監控平臺架構解析

安科瑞顧強———Acrelgq 智慧路燈作為智慧城市與新基建的核心載體,集成了大量異元異構電子設備,其供電安全與能效管理面臨電壓多樣、權屬分散、擴展性不足等挑戰。本文提出一種融合統一供電、分路計量、智能防護與遠程監控的解決方案,通過構…

DMBOK對比知識點對比(1)

1.CDGP各章活動 章節一級

css設置動態數值:clamp函數

CSS 的 clamp() 函數是一個強大的工具,用于創建響應式且范圍可控的動態值。它結合了min() 和max() 的邏輯,允許你定義一個值在最小值和最大值之間動態調整。 語法為: clamp(最小值, 首選值, 最大值); 工作原理: 當 …

數值計算與數據相關參數剖析:保障模型訓練穩定與準確

一、計算類型:以BF16為例 1.1 核心作用 BF16 是一種計算方式,它能讓模型訓練更快,還省內存。比如訓練模型時,用普通方式可能很慢,占內存也多,而 BF16 就像給模型開了 “加速鍵”,訓練起來更高…

數據庫讀寫分離解決方案

數據庫讀寫分離解決方案 一、讀寫分離核心概念 讀寫分離(Read/Write Splitting)是通過將數據庫的讀操作和寫操作分離到不同的數據庫節點來提升系統整體性能的架構模式。 核心原則:寫操作集中在主庫(Master),讀操作分散到從庫(Slave),通過數據復制保持主從一致性 二、技術實…

小白的進階之路系列之七----人工智能從初步到精通pytorch自動微分優化以及載入和保存模型

本文將介紹Pytorch的以下內容 自動微分函數 優化 模型保存和載入 好了,我們首先介紹一下關于微分的內容。 在訓練神經網絡時,最常用的算法是反向傳播算法。在該算法中,根據損失函數相對于給定參數的梯度來調整參數(模型權重)。 為了計算這些梯度,PyTorch有一個內置…

【圖像處理基石】立體匹配的經典算法有哪些?

1. 立體匹配的經典算法有哪些? 立體匹配是計算機視覺中從雙目圖像中獲取深度信息的關鍵技術,其經典算法按技術路線可分為以下幾類,每類包含若干代表性方法: 1.1 基于區域的匹配算法(Local Methods) 通過…

《Map 到底適合用哪個?HashMap、TreeMap、LinkedHashMap 對比實戰》

大家好呀!今天我們來聊聊Java中超級重要的Map集合家族 🎢。Map就像是一個神奇的魔法口袋,可以幫我們把東西(值)和標簽(鍵)一一對應存放起來。不管你是Java新手還是老司機,掌握Map都是…

TencentOSTiny

開放原子開源基金會 騰訊物聯網終端操作系統 _物聯網操作系統_物聯網OS_TencentOS tiny-騰訊云 GitHub - OpenAtomFoundation/TobudOS: 開放原子開源基金會孵化的物聯網操作系統,捐贈前為騰訊物聯網終端操作系統TencentOS Tiny 項目簡介 TencentOS Tiny 是騰訊…

使用 Selenium 進行自動化測試:入門指南

在現代軟件開發中,自動化測試已經成為不可或缺的一部分。它不僅提高了測試效率,還減少了人為錯誤的可能性。Selenium 是一個強大的開源工具,廣泛用于 Web 應用程序的自動化測試。本文將詳細介紹如何使用 Selenium 進行自動化測試,…

C54-動態開辟內存空間

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 頭文件中&#xff09; 作用&#xff1a;分配一塊連續的、未初始化的內存塊&#xff0c;大小為 size 字節。 返回值&#xff1a; 成功&#xff1a;返回指向分配內存首地址的 void* 指針…

ELK服務搭建-0-1搭建記錄

ELK搭建 需要準備一臺linux服務器&#xff08;最好是CentOS7&#xff09;,內存至少4G以上&#xff08;三個組件都比較占用內存&#xff09; 演示基于ElasticSearch采用的是8.5.0版本 1、 Docker安裝Elasticsearch 創建一個網絡 因為我們還需要部署kibana容器、logstash容器&am…

調參指南:如何有效優化模型訓練效果

?? 調參指南:如何有效優化模型訓練效果(深度學習實戰) 模型跑通不難,調得好才是本事。本篇文章將系統講解如何在訓練過程中有效調參,從學習率到網絡結構,從損失函數到正則化,讓你的模型效果“飛升”。 ?? 一、為什么需要調參? 初學者常常以為模型訓練完就“任務完…

laya3的2d相機與2d區域

2d相機和2d區域都繼承自Sprite。 2d相機必須作為2d區域的子節點&#xff0c;且2d相機必須勾選isMain才能正常使用。 2d區域下如果沒有主相機&#xff0c;則他和Sprite無異&#xff0c;他的主要操作皆是針對主相機。 2d相機可以調整自己的移動范圍&#xff0c;是否緊密跟隨&a…

【保姆級教程】Windows部署LibreTV+cpolar實現遠程影音庫訪問全步驟

文章目錄 前言1.關于LibreTV2.docker部署LibreTV3.簡單使用LibreTV4.安裝cpolar內網穿透5.配置ward公網地址6.配置固定公網地址總結 前言 當周末的閑暇時光來臨時&#xff0c;您是否也習慣性地癱倒在沙發上&#xff0c;渴望通過影視作品緩解一周的疲憊&#xff1f;然而在準備點…

Windows安裝Docker部署dify,接入阿里云api-key進行rag測試

一、安裝docker 1.1 傻瓜式安裝docker Get Docker | Docker Docs Docker原理&#xff08;圖解秒懂史上最全&#xff09;-CSDN博客 官網選擇好windows的安裝包下載&#xff0c;傻瓜式安裝。如果出現下面的報錯&#xff0c;說明主機沒有安裝WSL 1.2 解決辦法 安裝 WSL | Mic…

Cursor 與DeepSeek的完美契合

這兩天在看清華大學最近出的一個關于deepseek入門的官方視頻中&#xff0c;看了幾個deepseek的應用場景還是能夠感覺到它的強大之處的&#xff0c;例如根據需求生成各種markdown格式的代碼&#xff0c;再結合市面上已有的一些應用平臺生成非常好看的流程圖&#xff0c;PPT,報表…

【深度學習】13. 圖神經網絡GCN,Spatial Approach, Spectral Approach

圖神經網絡 圖結構 vs 網格結構 傳統的深度學習&#xff08;如 CNN 和 RNN&#xff09;在處理網格結構數據&#xff08;如圖像、語音、文本&#xff09;時表現良好&#xff0c;因為這些數據具有固定的空間結構。然而&#xff0c;真實世界中的很多數據并不遵循網格結構&#x…