1. 程式人生 > 實用技巧 >暫存器(記憶體訪問)

暫存器(記憶體訪問)

記憶體中字的儲存

CPU中16位暫存器儲存一個字型資料,在記憶體中儲存時,記憶體單元是位元組單元,則一個字型資料要用兩個地址連續的記憶體單元來存放,這個字的地位位元組存放在地位地址彙總,高位位元組存放在高位地址中。
字單元的概念:存放一個字型資料(16位)的記憶體單元,由連個地址連續的記憶體單元組成。
將起始地址為N的字單元檢測為N地址子單元

DS和[address]

DS暫存器用來存放資料地址的段地址
可以將記憶體單元中的資料存放到暫存器中去
mov al,[0]
將暫存器中的資料儲存到記憶體單元中
mov [00ff],ax

DS暫存器不同於[ABCD]X暫存器,不可以使用 mov ds,1000H的方式對其進行賦值

字的傳送

可以將一組起始地址為16的倍數、地址連續、長度為N(N<=64KB)的記憶體單元當做專門的資料儲存空間

棧:具有特殊訪問方式的連續記憶體空間

CPU提供的棧機制

8086CPU提供入棧和出棧的指令,最基本的是 PUSH(入棧)和 POP(出棧)。比如,push ax 表示將暫存器 ax 中的資料送入棧中,pop ax 表示從棧頂去除資料送入 ax。8086CPU的入棧和出棧操作都是以字為單位操作的。
push 和 pop 指令的格式可以是如下形式:
push 暫存器 將一個暫存器的資料入棧
pop 暫存器 用一個暫存器接受出棧的資料
push 記憶體單元 將一個記憶體單元處的字入棧
pop 記憶體單元 用一個記憶體單元接收出棧的資料
push [0]
pop [2]

關於棧的操作有兩點疑問:

  1. 如何設定圖中空間,才能使圖中空間作為棧使用push和pop進行操作的
  2. push和pop時是如何知道哪個記憶體單元是棧頂的
    8086CPU中有兩個暫存器,段暫存器 SS 和暫存器 SP,這兩個暫存器所組成的地址就是棧頂記憶體單元地址
    push ax 的執行,由以下兩步完成
  3. SP=SP-2,SS:SP所組合的記憶體地址作為棧頂記憶體單元地址
  4. 將ax中的內容送入 SS:SP指向的記憶體單元處

pop ax 的執行過程和push ax 剛好相反,由以下兩步完成

  1. 將SS:SP指向的記憶體單元處的資料送入ax中
  2. SP=SP+2,SS:SP所組合的記憶體地址作為棧頂記憶體單元地址

debug的 t 命令在執行修改暫存器 SS 的指令時,下一條指令也會緊接著被執行

棧頂越界問題

依靠 SS 和 SP 可以確保在入棧和出棧時找到棧頂,但是如何保證在入棧、出棧時,棧頂不會超出佔空間?

8086CPU不保證我們對棧的操作不會越界,8086CPU只知道棧頂在哪裡,不知道棧空間大小

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

分析:棧最底部的字單元地址為 1000:FFFE,現在棧狀態為空,棧中沒有元素,也就不存在棧頂元素,所以 SS:SP 只能指向棧的最底部單元下面的單元,該單元的地址為為棧最底部字單元地址+2,FFFE+2=10000,SP 中儲存0000H,所以當棧為空的時候,SS=1000H,SP=0