棧Stack和段寄存器SS,SP(學習匯編)


1. 棧有2個基本操作:入棧、出棧 

2. 棧頂的元素總是最后入棧,最先出棧;后進先出。 

3. 8086CPU提供入棧和出棧的指令,最基本的兩個是 PUSH(入棧) 和 POP(出棧)

    push ax 表示將AX寄存器的內容送入棧中, pop ax 表示從棧頂取出數據送入AX寄存器中。

    8086CPU的入棧和出棧操作都是以字(word)為單位的。

4. 8086CPU中,段寄存器SS:存放棧頂段地址,段寄存器SP: 存放棧頂的偏移地址。 

5. 任意時刻:SS:SP 指向棧頂元素。

6. 8086CPU不保證我們對棧的操作是否會越界。

7. 棧頂是低地址單元, 棧底是高地址單元。 

8.  push 指令的執行步驟:

    (1) SP = SP - 2 (偏移地址減少,即往低地址處偏移[棧頂方向])

    (2) 向SS:SP指向的字單元中送入數據 

9. pop 指令的執行步驟:

    (1) 從SS:SP指向的字單元中讀取數據

    (2) SP = SP + 2       (偏移地址增加,即往高地址處偏移[棧低方向]) 

10. 8086CPU只記錄棧頂,棧空間的大小要我們自己管理。

11. 例子:

      如果將10000H ~ 1000FH 這段空間作為棧,初始狀態棧是空的,此時SS=1000H,SP = ?

     解答:

     首先,低地址單元在棧頂方向,高地址單元在棧低方向 。

     低地址

     10000H

      。

      。

      。

     1000DH

     1000EH

     1000FH

     -------------------

     10010H                          <-------------SS:SP指向棧空間最高地址單元的下一個單元。

 

     假設 AX = 2266H, 因為8086CPU的入棧和出棧操作都是以字為單位的 。所以,結果看下圖示。

     10000H

      。

      。

      。

     1000DH

     1000EH    66H   (AL)      <-------------SS:SP

     1000FH    22H   (AH)

     --------------------------------------------

     10010H

 

     以10000H ~ 1000FH這段空間為棧空間,SS=1000H,棧空間大小為16個字節。

     當初始狀態棧為空時,SP = 0010H。

12. 編程

      (1) 將10000H~1000FH這段空間當作棧,初始狀態棧是空的。

      (2) 設置AX寄存器 = 001AH, BX寄存器 = 001BH。

      (3) 利用棧,交換AX、BX寄存器中的數據。    

[cpp]  view plain copy
 
  1. mov ax, 1000H  
  2. mov ss, ax  
  3. mov sp, 0010H  
  4. mov ax, 001AH  
  5. mov bx, 001BH  
  6. push ax  
  7. push bx  
  8. pop ax  
  9. pop bx  

 13. 編程

      如果要在10000H入寫入字型數據2266H,可以使用以下代碼完成:    

[cpp]  view plain copy
 
  1. mov ax, 1000H  
  2. mov ds, ax  
  3. mov ax, 2266H  
  4. mov [0], ax  

      要求:不能使用“ mov 內存單元, 寄存器"這類指令,完成上面的功能。    

[cpp]  view plain copy
 
  1. mov ax, 1000H  
  2. mov ss, ax  
  3. mov sp, 2  
  4. mov ax, 2266H  

 


免責聲明!

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



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