8086匯編 棧操作


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指示),不知道程序安排的棧空間有多大。

我們在編程的時候要自己操心棧頂超界的問題 ,要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的數據太多而導致的超界;防止出棧時棧空了仍然繼續出棧而導致的超界。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM