1. 程式人生 > >第三章 暫存器(記憶體訪問)相關內容總結

第三章 暫存器(記憶體訪問)相關內容總結

      在本章中,我們從訪問記憶體的角度繼續學習了幾個暫存器。我們提出字單元的概念:字單元,即存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成。高地址記憶體單元中存放字型資料的高位位元組,低地址記憶體單元中存放字型資料的低位位元組。CPU要讀寫一個記憶體單元的時候,必須先給出這個記憶體單元的地址,在8086PC中,記憶體地址由段地址和偏移地址組成。8086CPU中有一個DS暫存器,通常用來存放要訪問資料的段地址。我們用mov指令在暫存器和記憶體之間進行位元組型資料的傳送。因為8086CPU是16位結構,有16根資料線,所以可以一次性傳送16位的資料。也就是說可以一次性傳送一個字。只要在mov指令中給出16位的暫存器就可以進行16位資料的傳送了。

      既然有“mov段暫存器,暫存器”,從暫存器向段暫存器傳送資料,那麼也應該有“mov暫存器,段暫存器”,從段暫存器向暫存器傳送資料。一個合理的設想是:8086CPU內部有暫存器到段暫存器的通路,那麼也應該有相反的通路。有了這個推測我們就可以用debug來驗證,可以看到執行結果:段暫存器ds中的值送到了暫存器ax中。通過驗證我們知道,“mov暫存器,段暫存器”是正確的指令。既然有“mov記憶體單元,暫存器”,從暫存器向記憶體單元傳送資料,那麼也應該有“mov記憶體單元,段暫存器”,從段暫存器向記憶體單元傳送資料。比如我們可以將段暫存器cs中的內容送入記憶體10000H處,在debug中進行試驗。“mov段暫存器,記憶體單元”也應該可行,比如我們可以用10000H處存放的字型資料設定ds(即將10000H處存放的字型資料送入ds)。

      對於8086PC機,在程式設計時,可以根據需要,將一組記憶體單元定義位一個段。我們可以將一組長度為N(N<=64KB)、地址連續、起始地址為16的倍數的記憶體單元當作專門儲存資料的記憶體空間,從而定義了一個數據段。那麼如何訪問資料段中的資料呢?將一段記憶體當作資料段,是在程式設計時的一種安排,可以在具體操作的時候,用ds存放資料段的段地址,再根據需要,用相關指令訪問資料段中的具體單元。

      綜上所述,可以總結以下幾點知識。

      字在記憶體中儲存時,要用兩個地址連續的記憶體單元來存放,字的低位位元組存放在低地址單元中,高位位元組存放在高位地址單元中。用mov指令訪問記憶體單元時,可以在mov指令中只給出單元的偏移地址,此時,段地址預設在DS儲存器中。[address]表示一個偏移地址為address的記憶體單元。在記憶體和儲存器之間傳送字型資料時,高地址單元和高8位暫存器、低地址單元和低8位暫存器相對應。mov、add、sub是具有兩個操作物件的指令。jmp是具有操作物件的指令。可以根據自己的推測,在debug中實驗指令的新格式。

      以下是棧的總結,8086CPU提供了棧操作機制,方案如下。在SS、SP中存放棧頂的段地址和偏移地址:提供入棧和出棧指令,它們根據SS:SP指示的地址,按照棧的方式訪問記憶體單元。push指令的執行步驟:1、SP=SP-2;2、向SS:SP指向的字單元中送入資料。pop指令的執行步驟:1、從SS:SP指向的字單元中讀取資料;2、SP=SP+2。任意時刻,SS:SP指向棧頂元素。8086CPU只記錄棧頂,棧空間的大小我們要自己管理。用棧來暫存以後需要恢復的暫存器內容時,暫存器出棧的順序要和入棧的順序相反。push、pop實質上是一種記憶體傳送指令,需注意他們的靈活運用。棧是一種非常重要的機制,一定要深入理解,並加以靈活運用。