第三章 暫存器 知識梳理
1.記憶體中字的儲存
子單元,即存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成。高地址記憶體單元中存放字型資料的高位位元組,低地址記憶體單元中存放字元型資料的低位位元組(小端法)
對於圖3.1 分析
0地址單元中存放的位元組型資料為 20H
0地址單元存放的字型資料是 4E20H
2. DS和[address]
8086cpu中有一個DS暫存器,通常用來存放要訪問資料的段地址
[···]表示一個記憶體單元,表示記憶體單元的偏移地址
注意:mov指令可以完成兩種傳送
(1)將資料直接送入暫存器
(2)將一個暫存器內容送入另一個暫存器
8086CPU不支援將資料直接送入段暫存器的操作,ds是一個段暫存器
至於為什麼,是硬體設計的問題?
3.字的傳送
採用小端法
字在記憶體中儲存時,要用兩個地址連續的記憶體單元來存放,字的低位位元組存放在低地址單元中,高位位元組存放在高地址單元中
4. mov add sub 指令
彙編指令 (1)操作碼
(2)運算元 (常數,暫存器運算元,記憶體單元運算元)
用mov指令訪問記憶體單元,可以在mov指令中只給出單元的偏移地址,此時,段地址預設在DS儲存器中。
mov 暫存器 ,資料
mov 暫存器,暫存器
mov 暫存器,記憶體單元
mov 記憶體單元,暫存器
mov 段暫存器,暫存器
mov 暫存器,段暫存器
mov 記憶體單元 段暫存器
mov 段暫存器,記憶體單元
add 暫存器,資料
add 暫存器 ,暫存器
add 暫存器,記憶體單元
add 記憶體單元,暫存器
sub 暫存器,資料
sub 暫存器,暫存器
sub 暫存器,記憶體單元
sub 記憶體單元,暫存器
注意:mov,add,sub是具有兩個操作物件的指令,jmp是具有一個操作物件的指令
5.資料段
將一組長度為N(N<=64KB),地址連續,起始位置為16的倍數的記憶體單元當作專門儲存資料的記憶體空間,從而定義了一個數據段
注意:一個字型資料佔據2個單元
6.棧
後進先出原則
7.CPU提供的棧機制
PUSH(入棧)POP(出棧)
在8086CPU中,有兩個暫存器,段暫存器SS和暫存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中。任意時刻,SS和SP指向棧頂元素,PUSH指令和POP指令執行時,CPU從SS和SP中得到棧頂的地址。
PUSH AX 的執行
(1)SP=SP-2,SS:SP指向當前棧頂前面的單元,以當前棧頂前面的單元作為新的棧頂
(2)將ax中內容送入SS:SP指向的的記憶體單元處,SS:SP此時指向新棧頂
入棧時棧頂從高地址向低地址方向增長
POP ax的執行
(1)將SS:SP指向的記憶體單元處的資料送入ax中
(2)SP=SP+2,SS:SP指向當前棧頂下面的單元,以當前棧頂下面的單元為新的棧頂。
注意:
出棧後 SS:SP指向新的棧頂1000EH,POP操作前的棧頂元素。1000CH處的2266H依然存在,但是已經不在棧中,當再次執行PUSH等入棧指令後,他將被覆蓋。
8.棧頂超界問題
8086CPU不保證我們對棧的操作不會超界,需要我們自己操心,(有沒有解決方案呢?)
8086CPU只記錄棧頂,棧空間大小我們自己要管理
我們儘量用到可能最大的棧空間
9.push,pop指令
初始棧為空棧
如果將10000H~1000FH這段空間當作棧,初始狀態為空棧,即ss=1000H,SP=0010H
注意:push,pup等棧操作指令,修改的只是SP,所以棧頂變化範圍最大是 0~FFFFH
10.棧段
(摘自 《組合語言》王爽)