計算機中的存儲器


存儲器是用來存放程序和數據的。計算機的存儲系統由內存(主存儲器)和外存(輔助存儲器)組成。內存設在主機內部,用來暫時存放當前運行的程序和使用的數據,其特點是存取速度快,但比外存容量小,且掉電后信息全部消失。外存設在主機外部(磁盤、光盤等),屬於計算機外部設備,用來存放當前不參與運行的程序和數據。其特點是能永久存放信息,存儲容量大,但存取速度較低。

一、存儲器的組成

存儲器的基本單位是位,它能存儲一位二進制數的 0 或 1。每 8 位組成一個字節,每相鄰的 2 個字節還可組成一個字,每相鄰的 4 個字節又可組成雙字,依此類推。

存儲器存取的最小單位是一個字節信息,叫作一個存儲單元,存儲器是由若干個存儲單元組成的。存儲器的容量就是存儲單元的個數。

為了訪問不同的存儲單元,每一單元都被指定一個編號,這個編號叫作該存儲單元的物理地址。8086/8088 CPU 有 20 條地址線,因此具有 1MB 的尋址能力(220=1MB),最低地址編號為 00000H,最高地址編號為 0FFFFFH,如圖 8 所示。

對存儲器的一次訪問可以讀寫一個字節或一個字,甚至可以訪問一個雙字。

存儲單元地址表示

圖 8 存儲單元地址表示

二、存儲器的段結構

8086/8088 CPU 有 20 條地址總線傳輸地址,即使用 20 位的物理地址編號,直接尋址范圍為 1MB,而 CPU 內部的運算器和寄存器都是 16 位結構,只能表示和處理 16 位地址,16 位地址范圍最大只能是 64KB。為了能尋址 1MB 范圍的存儲空間,所以采用了存儲器的分段技術。

所謂存儲器分段技術,就是把 1MB 的存儲空間划分成任意的一些段,每個段是一個可獨立尋址的邏輯單位,其最大長度不超過 64KB,這樣段內的地址就可以用 16 位表示。每個段的起始地址叫段基址,且規定,各段的起始地址都從能被 16 整除的地址開始。也就是說,段基址的最低 4 位總是 0,段基址的高 16 位放入段寄存器中。

在 8086/8088 的程序中,需要設立幾個段,每個段有多少個字節以及每個段有什么用途完全由用戶自己確定。每個段中存儲的代碼或數據,可以存放在段內任意單元中。

在程序中設置的段叫邏輯段,各個邏輯段在物理存儲器中可以是鄰接的、間隔的、部分重疊的和完全重疊的 4 種情況,如圖 9 所示。所以一個物理存儲單元可映像到一個或多個邏輯段中。例如圖 9 中 DATA_BYTE 單元可映像到段 2、段 3 和段 4 中。

物理存儲器中的段結構

圖 9 物理存儲器中的段結構

存儲器雖然可以划分成若干個段,但是在任何時刻,一個程序只能訪問 4 個段中的內容,這 4 個段分別是代碼段(Code Segment)、數據段(Data Segment)、堆棧段(Stack Segment)和附加段(Extra Segment)。它們分別由對應的 4 個段寄存器 CS、DS、SS、ES 指向。這 4 個段寄存器分別保存 4 個段的段基址高 16 位二進制數,即段基值。由 4 個段寄存器指向的那些段叫當前段。所以,當前段至多可容納 64KB 的代碼、64KB 堆棧和 128KB 的數據(分別由 DS、ES 指向的當前段)。如果應用規模較大,可以在程序中通過修改相應段寄存器的內容而訪問其他段。如圖 10 所示,由於 4 個段寄存器有段 B、F、I、K 的段基值,所以段 B、段 F、段 I、段 K 是當前段。如果程序需要訪問其他段(如段 J)中的數據,那么可用程序辦法修改 DS 或 ES 的內容為 J 的段基值,改變當前段。

存儲器中的當前段

圖 10 存儲器中的當前段

三、邏輯地址與物理地址

在 8086/8088 微機中,每個存儲單元有兩種地址:物理地址(Physical Address)和邏輯地址(Logical Address)。在 1MB 的存儲空間中,每一個存儲單元(即一個字節單元)的物理地址是唯一的,就是這個單元的地址編碼。物理地址由二進制的 20 位組成,它的范圍是 00000H~FFFFFH。CPU 與存儲器之間的任何信息交換,都使用物理地址。

在程序設計中,使用邏輯地址而不使用物理地址,這不僅有利於程序的開發,且對存儲器的動態管理也是有利的。一個邏輯地址是由段基值和偏移量兩部分組成的,且都是無符號 16 位二進制數。表達形式為“段基值:偏移量”,如 2010H:0100H,或 DS:10A2H。

段基值是一個段起始單元地址(段基址)的高 16 位,它存放在某一個段寄存器中。偏移量(偏移地址)表示某存儲單元與它所在段的段基址之間的字節距離。當偏移量為 0 時,就是這個段的起始單元。當偏移量為 0FFFFH 時,就是這個段的最后一個字節單元。由於邏輯段可以重疊,因此,同一個物理地址可以得到不同的邏輯地址。例如,兩個邏輯地址 2010H:1000H 和 2000H:1100H 對應同一物理地址 21100H,即它們指向同一存儲單元。

由於段基值由段寄存器指出,因此,在程序中要對某個存儲單元的數據進行存取時,只需要給出偏移量。程序中給出偏移量常用符號或某種尋址表達式,然后由計算機計算出偏移量。這種由計算機根據尋址表達式計算出的偏移地址叫有效地址,用 EA 表示。

每當 CPU 訪問存儲器時,總線接口單元 BIU 會把邏輯地址轉換成物理地址。轉換方法是:首先把邏輯地址中的段基值(在段寄存器中)左移 4 位,形成 20 位的段起始地址(段基址),然后再加上 16 位的偏移量,產生 20 位的物理地址,轉換過程如圖 11 所示。

邏輯地址到物理地址的轉換

圖 11 邏輯地址到物理地址的轉換

四、堆棧

堆棧是用程序在內存中定義的一個段(段值由 SS 指示)。這個段是按照“后進先出”的規則進行數據存取的特殊存儲區域,主要用於暫存數據以及在過程調用或中斷處理時暫存斷點信息。

堆棧是一端固定、另一端浮動的存儲區。所有信息的存取都在浮動的一端進行。這個存儲區最大地址的字存儲單元為堆棧底部,叫棧底(Bottom)。在堆棧中存放的數據從這里開始,逐漸向地址小的方向“堆積”。在任何時刻,存放最后一個信息的存儲單元(即已存放信息的最小地址單元)為堆棧頂部,叫棧頂(Top)。棧頂是隨着存放信息的多少而變的,它是這個存儲區的浮動“端頭”,而棧底是固定不變的,它是固定“端頭”,如圖 12 所示。

8086/8088 堆棧構造

圖 12 8086/8088 堆棧構造

由於堆棧頂部是浮動的,為了指示現在堆棧中存放數據的位置,設置了一個堆棧指針 SP(Stack Pointer)指向堆棧的頂部。這樣,堆棧中數據的進出都由 SP 來“指揮”。

在堆棧中存取數據的規則是“先進后出”。就是說最先進入堆棧的數據(在棧頂底部),最后才能取出。相反,最后送入堆棧的數據(在堆棧頂部),最先取出。

原文:計算機中的存儲器

(完)


免責聲明!

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



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