第三章 的書本上主要有以下幾個內容:
1.內存中字的存儲
字單元:即存放一個字型數據(16位)的內存單元,由兩個地址連續的內存單元組成。
小端法:高地址內存單元中存放字型數據的高位字節,低地址內存單元中存放字型數據的地位字節。
任何兩個地址連續的內存單元,N號單元和N+1號單元,可以將他看成兩個內存單元,也可看成一個地址為N的字單元的高位字節單元和地位字節單元。
2.DS和[address]
8086有一個DS寄存器,通常用來存放要訪問的數據的段地址
比如讀取10000H單元的內容:
mov bx,1000H
mov ds,bx
mov al,[0]
[...]:代表一個內存單元,其中的數字代表內存單元的偏移地址?
mov al ,[0]所使用的段地址來自ds,但ds不能直接寫入數據(8086不支持將數據直接送入段寄存器的操作),所以借助其他的一般性寄存器。
8086CPU自動取ds中的數據為內存單元的段地址
?
3.字的傳送
我們用mov指令在寄存器和內存之間進行字節數據的傳送。因為8086CPU是16位結構,有16根數據線,所以,可以一次性傳送16位數據,也就是說可以一次性傳送一個字。
只要mov指令中給出16位的寄存器就可以進行16位的數據的傳送了。比如:
mov bx,1000h
mov ds,ax
mov ax,[0]
mov [0],cx
4. mov add sub 指令
匯編指令? ?(1)操作碼
? ? ? ? ? ? ? ? ? (2)操作數? ?(常數,寄存器操作數,內存單元操作數)
用mov指令訪問內存單元,可以在mov指令中只給出單元的偏移地址,此時,段地址默認在DS存儲器中。
mov? 寄存器,寄存器
mov? 寄存器,內存單元
mov? 內存單元,寄存器
mov? 段寄存器,寄存器
mov? 寄存器,段寄存器
mov 內存單元 段寄存器
mov 段寄存器,內存單元
?
add 寄存器,數據
add 寄存器 ,寄存器
add 寄存器,內存單元
add? 內存單元,寄存器
?
sub 寄存器,數據
sub 寄存器,寄存器
sub 寄存器,內存單元
sub 內存單元,寄存器
5.數據段
可以將一組長度為N(N<=64KB)、地址連續,起始地址為16的倍數的內存單元當作專門存儲數據的內存空間——定義數據段
用ds存放數據段的段地址,
訪問時可以用ds存放數據段的段地址,再根據需要,用相關指令訪問數據段中的具體單元
6.棧
后進先出(LIFO):最后進入這個空間的數據,最先出去
棧頂:最后入棧的字數據所對應的地址單元
棧底:固定的一端,棧區最高地址單元的前一個單元
操作:push(入棧),棧頂上移,棧頂-2?
? ? ? ? ? ?pop(出棧),棧頂下移,棧頂+2
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.棧頂超界問題
當棧空時,再使用pop出棧,當棧滿時,再使用push入棧
要根據可能用到的最大棧空間來安排棧的大小,防止入棧的數據與太多而導致的超界;執行出棧的時候繼續出棧二導致的超界。
9.push、pop指令
push、pop實質上就是一種內存傳送指令,可以在寄存器和內存之間傳送數據,與mov指令不同的是,push和pop指令訪問的內存單元的地址不是在指令中給出的,而是由ss:sp指出的。
執行push時:先改變sp,后向ss:sp處傳送。
執行pop時:先讀取ss:sp處的數據,后改變sp。
棧頂的最大變化范圍為0~FFFFH。