匯編 | CPU物理地址本質理解


物理地址

我們知道,CPU訪問內存單元時,要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間,每一個內存單元在這個空間中都有唯一的地址,我們將這個唯一的地址稱為物理地址。
CPU通過地址總線送入存儲器的,必須是一個內存單元的物理地址。在CPU向地址總線上發出物理地址之前,必須要在內部先形成這個物理地址。不同的CPU可以有不同的形成物理地址的方式。我們現在討論8086CPU是如何在內部形成內存單元的物理地址的。

16位結構的CPU

我們說8086CPU的上一代CPU(8080, 8085)等是8位機,而8086是16位機,也可以說8086是16位結構的CPU。那么什么是16位結構的CPU呢?
概括地講,16位結構(16位機、字長為16位等常見說法,與16位結構的含義相同)描述了一個CPU具有下面幾方面的結構特性。

運算器一次最多可以處理16位的數據;

寄存器的最大寬度為16位;

寄存器和運算器之間的通路為16位。

8086是16位結構的CPU,這也就是說,在8086內部,能夠一次性處理、傳輸、暫時存儲的信息的最大長度是16位的。內存單元的地址在送上地址總線之前,必須在CPU中處理、傳輸、暫時存放,對於16位CPU,能一次性處理、傳輸、暫時存儲16位的地址。

8086CPU給出物理地址的方法

8086CPU有20位地址總線,可以傳送20位地址,達到1MB尋址能力。8086CPU又是16位結構,在內部一次性處理、傳輸、暫時存儲的地址為16位。從8086CPU的內部結構來看,如果將地址從內部簡單地發出,那么它只能送出16位的地址,表現出的尋址能力只有64KB
8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。
8086CPU相關部件的邏輯結構如圖2.6所示。

如圖2.6所示,當8086CPU要讀寫內存時:
(1) CPU中的相關部件提供兩個16位的地址,一個稱為段地址,另一個稱為偏移地址;
(2) 段地址和偏移地址通過內部總線送入一個稱為地址加法器的部件:
(3) 地址加法器將兩個16位地址合成為一個20位的物理地址;
(4) 地址加法器通過內部總線將20位物理地址送入輸入輸出控制電路;
(5) 輸入輸出控制電路將20位物理地址送上地址總線;
(6) 20位物理地址被地址總線傳送到存儲器。

地址加法器采用 物理地址=段地址x16+偏移地址 的方法用段地址和偏移地址合成物理地址。例如,8086CPU要訪問地址為123C8H的內存單元,此時,地址加法器的工作過程如圖2.7所示(圖中數據皆為十一六進制表示)。

由段地址x16引發的討論

“段地址x16”有一個更為常用的說法是左移4位。計算機中的所有信息都是以二進制的形式存儲的,段地址當然也不例外。機器只能處理二進制信息,“左移4位”中的位,指的是二進制位。我們看一個例子,一個數據為2H,二進制形式為10B,對其進行左移運算:

左移位數       二進制     十六進制        十進制
      0         10B        2H             2
      1        100B        4H             4
      2       1000B        8H             8
      3      10000B       10H            16
      4     100000B       20H            32

觀察上面移位次數和各種形式數據的關系,我們可以發現:

  1. 一個數據的二進制形式左移 \(1\) 位,相當於該數據乘以 \(2\) ;

  2. 一個數據的二進制形式左移 \(N\) 位,相當於該數據乘以 \(2^N\);

  3. 地址加法器如何完成段地址 \(\times16\) 的運算? 就是將以二進制形式存放的段地址左移 \(4\) 位。
    進一步思考,我們可看出:

    一個數據的十六進制形式左移 \(1\) 位,相當於乘以 \(16\) ;

    一個數據的十進制形式左移 \(1\) 位,相當於乘以 \(10\);

    一個 \(X\)​ 進制的數據左移 \(1\)​ 位,相當於乘以 \(X\)​;


\[QAQ \]


注意,下面討論的是8086CPU段地址和偏移地址的本質含義,而不是為了解決具體的問題而在本質含義之上引申出來的更高級的邏輯意義。

不管以多少種不同的邏輯意義去看待“段地址x16+偏移地址=物理地址”的尋址模式,一定要清楚地知道它的本質含義,這樣才能更靈活地利用它來分析、解決問題。如果只拘泥於某一種引申出來的邏輯含義,而模糊本質含義的話,將從意識上限制對這種尋址功能的靈活應用。

“段地址x16+偏移地址=物理地址”的本質含義是:CPU在訪問內存時,用一個基礎地址(段地址x16)和一個相對於基礎地址的偏移地址相加,給出內存單元的物理地址。
更一般地說,8086CPU的這種尋址功能是“基礎地址+偏移地址=物理地址”尋址模式的一種具體實現方案。8086CPU中,段地址x16可看作是基礎地址。
下面,我們用兩個與cPu無關的例子做進一步的比喻說明。
第一個比喻說明“基礎地址+偏移地址=物理地址”的思想。
比如說,學校、體育館、圖書館同在一條筆直的單行路上(參考圖2.8),學校位於路的起點(從路的起點到學校距離是0米)。

你要去圖書館,問我那里的地址,我可以用兩種方式告訴你圖書館的地址:
(1)從學校走2826m到圖書館。這2826m可以認為是圖書館的物理地址。
(2)從學校走2000m到體育館,從體育館再走826m到圖書館。第一個距離2000m是相對於起點的基礎地址,第二個距離826m是相對於基礎地址的偏移地址(以基礎地址為起點的地址)。
第一種方式是直接給出物理地址2826m,而第二種方式是用基礎地址和偏移地址相加來得到物理地址的。
第二個比喻進一步說明“段地址x16+偏移地址一物理地址”的思想。
我們為上面的例子加一些限制條件,比如,只能通過紙條來互相通信,你問我圖書館的地址我只能將它寫在紙上告訴你。顯然,我必須有一張可以容納4位數據的紙條,才能寫下2826這個數據。

可不巧的是,我沒有能容納4位數據的紙條,僅有兩張可以容納3位數據的紙條。這樣我只能以這種方式告訴你2826這個數據。

在第一張紙上寫上200(段地址),在第二張紙上寫上826(偏移地址)。假設我們事前對這種情況又有過相關的約定:你得到這兩張紙后,做這樣的運算:200(段地址)x10+826(偏移地址=2826(物理地址)。
8086CPU就是這樣一個只能提供兩張3位數據紙條的CPU


\[QAQ \]



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM