
我們知道, CPU訪問內存單元時,要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間,每一個內存單元在這個空間中都有唯一的地址,我們將這個唯一的地址稱為物理地址。
16位結構(16位機、字長為16位等常見說法,與16位結構的含義相同)描述了一個CPU具有下面幾方面的結構特性。
* 運算器一次最多可以處理16位的數據
* 寄存器的最大寬度為16位:
* 寄存器和運算器之間的通路為16位。
8086是16位結構的CPU,這也就是說,在8086內部,能夠一次性處理、傳輸、暫時存儲的信息的最大長度是16位的。內存單元的地址在送上地址總線之前,必須在CPU中處理、傳輸、暫時存放,對于16位CPU,能一次性處理、傳輸、暫時存儲16位的地址。

CPU通過地址總線送入存儲器的,必須是一個內存單元的物理地址。在CPU向地址總線上發出物理地址之前,必須要在內部先形成這個物理地址。不同的CPU可以有不同的形成物理地址的方式。我們現在討論8086CPU是如何在內部形成內存單元的物理地址的。
8086CPU有20位地址總線,可以傳送20位地址,達到1MB尋址能力。8086CPU又是16位結構,在內部一次性處理、傳輸、暫時存儲的地址為16位。從8086CPU的內部結構來看,如果將地址從內部簡單地發出,那么它只能送出16位的地址,表現出的尋址能力只有64KB.8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。

| | | | | | |
| --- | --- |--- | --- |--- |--- |
| | 1 | 2 | 3 | 0 | |
| | 0 | 0 | c | 8 | |
| 16進制左移一位 | | | | | |
| 1 | 2 | 3 | 0 | | |
| | 0 | 0 | c | 8 | |
16進制左移一位相當于二進制左移4位
1230=~~000~~1001000110000
00c8=~~00000000~~11001000
| | | | | | |
| --- | --- |--- | --- |--- |--- |
| | 0001 | 0010 | 0011 | 0000 | |
| | 0000 | 0000 | 1100 | 1000 | |
| 二進制左移四位 | | | | | |
| 0001 | 0010 | 0011 | 0000 | <span style="color:red">0000</span> | |
| | ~~0000~~ | ~~0000~~ | 1100 | 1000 | |
| 0001 | 0010 | 0011 | 1100 | 1000 | |
1 0010 0011 1100 1000=123c8
段地址就是基地址
二進制向左移4位就是乘以16(左移一位*2,左移2位*4,左移3位*8,左移4位*16)
下圖為2在其二進制(10B)下位移后的數值變化

一個數據的m進制形式左移1位,相當于該數據乘以m
16進制的段地址\*16左移1位,概念和10進制某個數\*10左移一位一個道理
一個數據的二進制形式左移一位,相當于該數據乘以2
一個數據的二進制形式左移n位,相當于該數據乘以2^n
段地址*16必然是16的倍數,所以一個段的的起始地址也一定是16的倍數
偏移地址為16位,16位地址的尋址能力位64k,所以一個段的長度最大為2^16=64k
cpu訪問內存單元時,必須向內存提供內存單元的物理地址
具象例子:比如說傳紙條,信息是2826,一張紙條只能容納3個數字,必須填滿紙條,一次可傳兩張:
在第一張紙上寫上200(段地址),在第二張紙上寫上826(偏移地址)。假設我們事前對,這種情況又有過相關的約定:你得到這兩張紙后,做這樣的運算: 200(段地址)x10+826(偏移地址-2826(物理地址)。8086CPU就是這樣一個只能提供兩張3位數據紙條的CPU.
8086cpu在內部用段地址和偏移地址移位相加的方法形成最終的物理地址





### **8086合成物理地址的過程**
我們說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有20位地址總線,可以傳送20位地址,達到1MB尋址能力。8086CPU又是16位結構,在內部一次性處理、傳輸、暫時存儲的地址為16位。從8086CPU的內部結構來看,如果將地址從內部簡單地發出,那么它只能送出16位的地址,表現出的尋址能h只有64KB.
解決辦法:8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。

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




cpu可以用不同的段地址和偏移地址形成同一個物理地址


如果給定一個段地址,僅通過變化偏移地址來尋址,最多可以定位多少內存單元?
偏移地址16位變化范圍為0~FFFFH(2^16-1),僅通過變化偏移地址來尋址,最多可以定位2^16=64k內存單元
比如給定段地址1000H,用偏移地址尋址,cpu的尋址范圍為10000H~1FFFFH
段地址*16:相當于16進制向左移1位即10000H,范圍就是(0+10000H,FFFFH+10000H)
1000轉換為十進制(4096)\*16+偏移地址范圍(2^16-1)
65536+65535=131071(轉換成16進制后為1ffff)
(0+SA,FFFFH+SA)=20000H
在8086pc機中存儲單元的地址用兩個元素拉描述,即段地址和偏移地址
數據在21F60H內存單元中,對于8086pc機的描述:
* 數據存在內存2000:1F60單元中
* 數據存在內存的2000段中的1F60H單元中
可更具需要將地址連續、起始地址為16的倍數的一組內存單元定義為1個段
例子:
有一數據存放在內存20000H單元中,現給定段地址為SA,若想要偏移地址尋到此單元,則SA滿足的條件是:最大?(2000H)最小?(1001H)提示,當段地址給定對少cpu無 論怎么變化偏移地址都無法尋到20000H單元
結果:當段地址給定為 1001H 以下和 2000H 以上,CPU無論怎么變化偏移地址都無法尋到20000H單元。
解題過程:
物理地址=SA\*16+EA
20000h=SA\*16+EA
SA=(20000h-EA)/16=20000h/16-EA/16=2000h-EA/16
EA取最大值時,SA=2000h-ffffh/16=2000H-fffH=1001h,SA為最小值
EA取最小值時,SA=2000h-0h/16=2000h,SA為最大值
延伸:(不知道對不對)
例子:
有一數據存放在內存21F60H單元中,現給定段地址為SA,若想要偏移地址尋到此單元,則SA滿足的條件是:最大?最小?
解題過程:
物理地址=SA\*16+EA
21F60H=SA\*16+EA
SA=(21F60h-EA)/16=21F60/16-EA/16=21F6h-EA/16
EA取最大值時,SA=21F60h-ffffh/16=21F6H-fffH=11F7H,SA(段地址)為最小值11F7H
EA取最小值時,SA=21f6h-0h/16=21F6h,SA(段地址)為最大值21F6h
注意:可分段的必須是16的整數,如:
21f00
...
21f70
21f80
21f90
可知一個物理地址的段地址取值范圍是(舍去右邊一位的xxxxx~舍去右邊一位的xxxxx-fff)