1. 程式人生 > >【組合語言】——第三章課後總結

【組合語言】——第三章課後總結

第三章 的書本上主要有以下幾個內容:

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。