2.9 段暫存器
我們前面講到,8086cpu在訪問記憶體時要由相關部件提供記憶體單元的段位址和偏移位址,送入位址加法器合成實體地址。這裡,需要看一下,是什麼部件提供段位址。段位址在8086cpu的段暫存器中存放。8086cpu有4個段暫存器:cs、ds、ss、es。當8086cpu要訪問記憶體時由這4個段暫存器提供記憶體單元的段位址。本章中只看一下cs。
2.10 cs和ip
cs和ip是8086cpu中兩個最關鍵的暫存器,它們指示了cpu當前要讀取指令的位址。cs為**段暫存器,ip為指令指標暫存器,從名稱上我們可以看出它們和指令的關係。
在8086pc機中,任意時刻,設cs中的內容為m,ip中的內容為n,8086cpu將從記憶體m*16+n單元開始,讀取一條指令並執行。
也可以這樣表述:8086機中,任意時刻,cpu將cs:ip指向的內容當作指令執行。
圖2.10展示了8086cpu讀取、執行指令的工作原理(圖中只包括了和所要說明的問題密切相關的部件,圖中數字都為十六進製制)。
圖2.10 8086pc讀取和執行指令的相關部件
圖2.10說明如下。
(1) 8086cpu當前狀態:cs中的內容為2000h,ip中的內容為0000h;
(2) 記憶體20000h~20009h單元存放著可執行的機器碼;
(3) 記憶體20000h~20009h單元中存放的機器碼對應的彙編指令如下。
下面的一**(圖2.11~圖2.19),以圖2.10描述的情況為初始狀態,展示了8086cpu讀取、執行一條指令的過程。注意每幅圖中發生的變化(下面對8086cpu的描述,是在邏輯結構、巨集觀過程的層面上進行的,目的是使讀者對cpu工作原理有乙個清晰、直觀的認識,為組合語言的學習打下基礎。其中隱蔽了cpu的物理結構以及具體的工作細節)。
圖2.11 初始狀態(cs:2000h,ip:0000h,cpu將從記憶體2000h×16+0000h處讀取指令執行)
圖2.13 位址加法器將實體地址送入輸入輸出控制電路
圖2.14 輸入輸出控制電路將實體地址20000h送上位址匯流排
圖2.15 從記憶體20000h單元開始存放的機器指令b8 23 01通過資料匯流排被送入cpu
圖2.16 輸入輸出控制電路將機器指令b8 23 01送入指令緩衝器
圖2.17 ip中的值自動增加
圖2.18 執行控制器執行指令b8 23 01(即mov ax,0123h)
圖2.19 指令b8 23 01被執行後ax中的內容為0123h
(此時,cpu將從記憶體單元2000:0003處讀取指令。)
下面的一**(圖2.20~圖2.26),以圖2.19的情況為初始狀態,展示了8086cpu繼續讀取、執行3條指令的過程。注意ip的變化(下面的描述中,隱蔽了讀取每條指令的細節)。
圖2.20 cs:2000h,ip:0003h(cpu將從記憶體2000h×16+0003h處讀取指令bb 03 00)
圖2.21 cpu從記憶體20003h處讀取指令bb 03 00入指令緩衝器(ip中的值加3)
圖2.22 執行指令bb 03 00(即mov bx,0003h)
圖2.23 cpu從記憶體20006h處讀取指令89 d8入指令緩衝器(ip中的值加2)
圖2.24 執行指令89 d8(即mov ax,bx)後,ax中的內容為0003h
圖2.25 cpu從記憶體20008h處讀取指令01 d8入指令緩衝器(ip中的值加2)
圖2.26 執行指令01 d8(即add ax,bx)後,ax中的內容為0006h
通過上面的過程展示,8086cpu的工作過程可以簡要描述如下。
(1) 從cs:ip指向的記憶體單元讀取指令,讀取的指令進入指令緩衝器;
(2) ip=ip+所讀取指令的長度,從而指向下一條指令;
(3) 執行指令。轉到步驟(1),重複這個過程。
在8086cpu加電啟動或復位後(即cpu剛開始工作時)cs和ip被設定為cs=ffffh,ip=0000h,即在8086pc機剛啟動時,cpu從記憶體ffff0h單元中讀取指令執行,ffff0h單元中的指令是8086pc機開機後執行的第一條指令。
現在,我們更清楚了cs和ip的重要性,它們的內容提供了cpu要執行指令的位址。
我們在第1章中講過,在記憶體中,指令和資料沒有任何區別,都是二進位制資訊,cpu在工作的時候把有的資訊看作指令,有的資訊看作資料。現在,如果提出乙個問題:cpu根據什麼將記憶體中的資訊看作指令?如何回答?我們可以說,cpu將cs:ip指向的記憶體單元中的內容看作指令,因為,在任何時候,cpu將cs、ip中的內容當作指令的段位址和偏移位址,用它們合成指令的實體地址,到記憶體中讀取指令碼,執行。如果說,記憶體中的一段資訊曾被cpu執行過的話,那麼,它所在的記憶體單元必然被cs:ip指向過。
王爽之《組合語言》學習重點四
2.9 段暫存器 我們前面講到,8086cpu在訪問記憶體時要由相關部件提供記憶體單元的段位址和偏移位址,送入位址加法器合成實體地址。這裡,需要看一下,是什麼部件提供段位址。段位址在8086cpu的段暫存器中存放。8086cpu有4個段暫存器 cs ds ss es。當8086cpu要訪問記憶體時由...
王爽之《組合語言》學習重點十一
實驗五 編寫 除錯具有多個段的程式 1 將下面的程式編譯連線,用debug載入 跟蹤,然後回答問題 assume cs code,ds data,ss stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data...
組合語言學習筆記3(王爽)
乙個字 兩個位元組,即乙個字需要兩個記憶體單元儲存。高位址放高位位元組,低位址放低位位元組。8086cpu為16位結構,有16位資料線,一次性可傳輸16位資料,也就是說對記憶體一次性操作兩記憶體單元即為乙個字。ds暫存器通常用來存放cpu要訪問資料的段位址,eg 0 表示記憶體單元的偏移位址。mov...