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
棧段暫存器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指示),不知道程式安排的棧空間有多大。
我們在程式設計的時候要自己操心棧頂超界的問題 ,要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的資料太多而導致的超界;防止出棧時棧空了仍然繼續出棧而導致的超界。
彙編自動出棧 組合語言入棧出棧PUSH和POP指令
前面我們一直在使用push ax和pop ax,顯然push和pop指令是可以在暫存器和記憶體 棧空間當然也是記憶體空間的一部分,它只是一段可以以一種特殊的方式進行訪問的記憶體 空間。之間傳送資料的。push和pop指令的格式可以是如下形式 push 暫存器 將乙個暫存器中的資料入棧 pop 暫存器...
ARM彙編之棧
建立程序的時候,會分配記憶體作為棧。實際棧指令 push,pop 是其他指令的別名,實際指令是str ldr或者其延伸指令。例s b sp,push 棧實現的幾種情況 堆疊型別 store load 完全下降 高位址在上,低位址在下 stmfd s b ldmfd ldm 完全公升序 高位址在下,低...
8086組合語言學習 三 8086中的段和棧
8086對記憶體定址的方式是通過段位址 16 偏移位址的方式實現的,而在16位的8086cpu下,段位址和偏移位址也都是16位的。這意味著,對於任意乙個段,段的起始位址必定為16的倍數 段位址 16 需要注意,記憶體段的概念並不是記憶體硬體所固有的,而是從cpu定址的角度出發,將記憶體中的物理連續區...