存儲器
8086系統的主存及其分段模式
計算機的存儲器包括主存(也稱內存)和輔存(也稱外存,如硬盤存儲器)。因為CPU只能直接訪問計算機的主存,所以,CPU所執行的程序和處理的數據都是存在主存中的, 程序員編程時只需與主存打交道即可。
主存需要有較大的容量,才能使計算機高效地工作。主存容量是以存儲單元的數量來計算的。現在,大多數計算機以1字節(8位二進制)的大小來定義一個存儲單元,即一個存儲單元可以存儲一個8位二進制數,並常用以下符號表示存儲容量的量級:KB(2^10 字節)、MB (2^20 字節)、GB(2^30 字節)以及TB(2^40 字節)。
為了准確描述數據在主存中的存儲位置,計算機系統對主存的每個存儲單元(字節)從0開始連續編號,並以此編號來確定存儲單元的位置。存儲單元編號也稱為存儲單元的地址,無論是向主存存數據(也稱寫數據),還是從主存取數據(也稱讀數據),都必須指出存儲單元的地址才行。
地址是存儲單元的編號,地址(編號)的位數決定了主存可以擁有的最大存儲單元數。一般而言,如果計算機系統的地址位數為n位(二進制位),則其主存的最大容量可以達到2n字節。例如,8086系統的主存地址位數是20位,其主存容量最大為220字節=1MB;80486系統的主存地址位數是32位,其主存容量最大可達2^32字節=4GB。
地址是在CPU對主存做讀/寫操作時,由CPU向主存發出的。所以,地址是在CPU中形成的。對8086系統,CPU要形成20位的主存地址,但是,CPU內部用於存放地址信息的寄存器均為16位寄存器(如前所述),無法存放一個完整的主存地址,為此,8086系 統對主存的使用采取了分段模式。
分段模式下,一個段的最大容量被限制在64KB,即2^16字節,因此,在一個段的范圍內,只需16位地址就可以准確指出每個存儲單元,16位的地址也可以用16位寄存器來存放了。但是,這個16位地址只是相對於一個段的內部來定義的,稱為段內地址(或段內偏移地址),並不是20位的主存實際地址(也稱主存物理地址),並不能直接用來訪問主存。圖(段內偏移地址與物理地址的關系)所示為段內偏移地址與主存物理地址的關系。
圖(段內偏移地址與物理地址的關系)中,從物理地址處開始,定義了一個段,物理地址i稱為該段的段首地址,簡稱段地址。顯然,段內一個存儲單元的物理地址是該存儲單元的段內偏移地址與該段的段地址之和。由此可見,要得到段內一個存儲單元的物理地址,除了需要該存儲單元的段內偏移地址,還必須有該段的段地址。也就是說,在8086系統的主存分段模式下,一個存儲單元的地址要用段地址和段內偏移地址兩部分表示,這樣表示的地址也稱為邏輯地址,是匯編語言程序設計時所用的地址表示形式。
由於段地址本身是一個20位的物理地址,而CPU中用來存放段地址的段寄存器均為16位寄存器,如何解決這個矛盾呢?為此,8086系統規定,只有能被16整除的物理地址才能作為段地址;這樣的物理地址其二進制表示形式有如下特征:
xxxxxxxxxxxxxxxx0000
其中,X表示0或1。由於段地址的最低4位必為0,所以,CPU中的段寄存器實際只存放了段地址的高16位,這就解決了段地址在CPU中的表示問題。而CPU中專設的地址加法器,會在將邏輯地址轉換成物理地址時,自動在16位段地址低位部分添加4個0,然后再與段內偏移地址相加。
8086系統中,邏輯地址通常表示為
段地址:段內偏移地址
的格式。設某存儲單元的邏輯地址用十六進制表示為138D:0200,求該存儲單元的物理地址。
解:首先在段地址低位添0(對十六進制,只需添一個0),得到實際的段首地址138D0H,然后再與段內偏移地址0200H相加
138D0H + 0200H = 13AD0H
所以,該存儲單元的物理地址為13AD0H(二進制表示為00010011101011010000)。
數據在主存中的存儲方式
8086系統中,根據數據的位數不同,定義了以下幾種數據類型。
- 字節類型:數據位數為8位(1字節),在主存中存儲時占用1個存儲單元。
- 字類型:數據位數為16位(2字節),在主存中存儲時占用2個存儲單元。
- 雙字類型:數據位數為32位(4字節),在主存中存儲時占用4個存儲單元。
- 四字類型:數據位數為64位(8字節),在主存中存儲時占用8個存儲單元。
- 十字節類型:數據位數為80位(10字節),在主存中存儲時占用10個存儲單元。
可見,數據位數均為字節的整數倍;位數多於1字節的,稱為多字節數據。一個多字節數據在主存中存儲時,需要占用地址連續的多個存儲單元,數的低位字節存儲在地址較低的存儲單元,而該多字節數所占用的最低地址,就作為該數的地址。圖(多字節數存儲示例)所示為雙字數據3A625C89H在主存中的存儲情況,該數的地址為21004H。