第三章 寄存器(內存訪問)相關內容總結
在本章中,我們從訪問內存的角度繼續學習了幾個寄存器。我們提出字單元的概念:字單元,即存放一個字型數據(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實質上是一種內存傳送指令,需註意他們的靈活運用。棧是一種非常重要的機制,一定要深入理解,並加以靈活運用。
第三章 寄存器(內存訪問)相關內容總結