2.8段的概念

 我們注意到,“段地址”這個名稱中包含着“”的概念。這種說法可能對一些學習者產生了誤導,使人誤以爲內存被劃分成一個一個的段,每一個段都有一個地址。如果我們在一開始形成了這種認知,將影響以後對彙編語言的深入理解和靈活應用。

 

    其實,內存並沒有分段,段的劃分來自於CPU。由於8086CPU用“基礎地址(段地址×16)+偏移地址=物理地址”的方式給出內存單元的物理地址,使得我們可以用分段的方式來管理內存

 

 如下圖所示,我們可以認爲:地址10000H~100FFH的內存單元組成一個段,該段的起始地址(基礎地址)爲10000H,段地址爲1000H,大小爲100H;我們也可以認爲地址10000H~1007F、10080H~100FHH的內存單元組成兩個段,它們的起始地址(基礎地址)爲:10000H和10080H,段地址爲:1000H和1008H,大小都爲80H。


分段

 

    以後,在編程時可以根據需要,將若干個地址連續的內存單元看做一個段,用段地址×16定位段的起始地址(基礎地址),用偏移地址定位段中的內存單元

 

    有兩點需要注意:段地址×16必然是16的倍數,所以一個段的起始地址也一定是16的倍數;偏移地址爲16位,16位的尋址能力爲64KB,所以一個段的長度最大爲64KB。

 

內存單元地址小結

 

    CPU訪問內存單元時,必須向內存提供內存單元的物理地址8086CPU在內部用段地址和偏移地址移位相加的方法形成最終的物理地址。

 

    思考下面的兩個問題。

 

    (1)觀察下面的地址,你有什麼發現?

 

    

物理地址

段地址

偏移地址

21F60H

2000H

1F60

 

2100H

0F60

 

21F0H

0060H

 

21F6H

0000H

 

1F00H

2F60H

 

    結論:CPU可以用不同的段地址和偏移地址形成同一個物理地址

 

 比如CPU要訪問21F60H單元,則它給出的段地址SA和偏移地址EA滿足SA×16+EA=21F60H即可。

 

    (2)如果給定一個段地址,僅通過變化偏移地址來進行尋址,最多可以定位多少個內存單元?

 

 結論:偏移地址16位,變化範圍爲0~FFFFH,僅用偏移地址來尋址最多可以尋64KB個內存單元。

 

 比如給定段地址1000H,用偏移地址尋址,CPU的尋址範圍爲:10000H~1FFFFH。

 

 在8086PC機中,存儲單元的地址用兩個元素來描述,即段地址和偏移地址。

 

    “數據在21F60H內存單元中。”這句話對於8086PC機一般不這樣講,取而代之的是兩種類似的說法:①數據存在內存2000:1F60單元中;②數據存在內存的20000H段中的1F60H單元中。這兩種描述都表示“數據在內存21F60H單元中”。

 

    可以根據需要,將地址連續、起始地址爲16的倍數的一組內存單元定義爲一個段。

 

    問:什麼是段地址?

    答:段地址是針對內存的分段而言的,將每一段的段首地址定義爲段地址段地址的存在是由系統的分段存儲決定的,通過段地址和偏移地址就能對數據進行尋訪。

 

 問:什麼是偏移地址?

 答:偏移地址也稱爲偏移量,由於8086/8088CPU內部的ALU只能進行16位的運算,而8086/8088有20條地址線,直接尋址能力1MB。因此,8086/8088所使用的20位物理地址,是由相應的段地址加上偏移地址組成的。

 

 問:爲什麼給定段地址1000H,用偏移地址尋址,CPU的尋址範圍爲:10000H~1FFFFH?

    答:把段地址1000H,乘以16,就是在1000H後面加上個0,可得到10000H。

 把10000H,加上偏移量的範圍0000H~FFFFH,

 即有CPU的尋址範圍:10000H~1FFFFH。

    ----------

 偏移量的範圍0000H~FFFFH,就是16位二進制數的變化範圍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章