8086匯編 棧操作
棧結構
一、說明
棧是一種只能在一端進行插入或刪除操作的數據結構。
棧有兩個基本的操作:入棧和出棧。
- 入棧:將一個新的元素放到棧頂;
- 出棧:從棧頂取出一個元素。
棧頂的元素總是最后入棧,需要出棧時,又最先被從棧中取出。
棧的操作規則:LIFO(Last In First Out,后進先出)。
二、8086棧
8086CPU提供相關的指令,支持用棧的方式訪問內存空間。
基於8086CPU的編程,可以將一段內存當作棧來使用。
棧操作
一、指令介紹
push、pop 實質上就是一種內存傳送指令,可以在寄存器和內存之間傳送數據,與mov指令不同的是,push和pop指令訪問的內存單元的地址不是在指令中給出的,而是由SS:SP指出的。
執行push和pop指令時,SP 中的內容自動改變。
在SS,SP中存放棧頂的段地址和偏移地址,入棧和出棧指令根據SS:SP指示的地址,按照棧的方式訪問內存單元。
8086CPU中,PUSH(入棧)和 POP(出棧)指令:
- push ax:將ax中的數據送入棧中
- pop ax:從棧頂取出數據送入ax
8086CPU中,有兩個與棧相關的寄存器:
- 棧段寄存器SS - 存放棧頂的段地址
- 棧頂指針寄存器SP - 存放棧頂的偏移地址
- SS:SP - 指向棧頂元素。
注:(以字為單位對棧進行操作)
二、原理解析
1、例:設將10000H~1000FH內存當作棧來使用……
2、入棧操作
3、出棧操作
三、棧的說明案
1、存入棧頂指針、棧的空間為10010H~10000H。棧的偏移量每次減去獲取的數據大小。
mov ax, 1000H
mov ss, ax
mov sp, 0010H
2、ax,bx,存入數據
mov ax, 001AH
mov bx, 001BH
3、將數據存入棧內、從1000FH開始存。
push ax
push bx
4、取出棧內數據存入ax,默認會取指針1000CH存入的數據,取出數據后。由於sp+2、指針發生變化指針移動到1000EH。
pop ax
pop bx
5、查看結構圖
6、push、pop 指令流程
push ax
(1)SP=SP–2;
(2)將ax中的內容送入SS:SP指向的內存單元處,SS:SP此時指向新棧頂。
pop ax
(1)將SS:SP指向的內存單元處的數據送入ax中;
(2)SP = SP+2,SS:SP指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。
7、棧頂超界問題
當棧滿的時候再使用push指令入棧, 將發生棧頂超界問題。
當棧滿的時候再使用pop指令入棧, 將發生棧頂超界問題。
8086CPU不保證對棧的操作不會超界。 8086CPU 只知道棧頂在何處(由SS:SP指示),不知道程序安排的棧空間有多大。
我們在編程的時候要自己操心棧頂超界的問題 ,要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的數據太多而導致的超界;防止出棧時棧空了仍然繼續出棧而導致的超界。