記憶體位置(Memory Address)
程式設計師常常利用"記憶體位置"來存取某些記憶單元的內容,在80X86系統中分成三種位置
1.邏輯位置 2.線性位置(又稱虛擬位置) 3.實體位置
邏輯位置(Logical Address)
邏輯位置屬於機械語言指令的一部分,可用來指定一個運算元(Operand)或是一個指令(Instruction)的位置。
這種位置採用80X86的分節式架構(Segmented Architecture),迫使M$ Windows的程式設計員必須將他們的程式切成許多Segment(節區)。
每一個邏輯位置由一個Segment和一個Offset(偏移量) 或是 Displacement(位移量) 組成 ; 而Offset 指出了節區起始處到實際位置之間的距離。
線性位置
由一個32位元的無號數(unsigned)整數定址 可定址到4GB的記憶單元(4,294,967,296) 。
線性位址通常以十六進位制(Hexadecimal)的符號來表示。
其範圍0x00000000~0xffffffff。
實體位置(Physical Address)
用來決定記憶體單元在記憶晶片的位址。
利用微處理器的位址引線(Address Pin) 來指定傳送到記憶體單元上
實體位址以32位元或36位元的無號數來表示
記憶體管理單元(Memory Management Unit 簡稱 MMU) 會利用一個名為分頁單元
(Segmentation Unit)的硬體電路,把邏輯位址轉成線性位址;然後接者有一個分
頁單元(Paging Unit)的硬體電路會把線性位址轉成實體位址
邏輯位址=>[分節單元]=>線性位址=>[分頁單元]=>實體位址=>記憶體單元
在多處理氣得系統中,所有CPU通常會共用相同的記憶體空間;所以記憶體晶片必
須可以有多個獨立自主的CPU同時存取。又因為記憶體晶片的讀寫操作必須依序
進行,所以要在每一個匯流排和每一個記憶體晶片上之間安插
一個記憶體仲裁器(Memory Arbiter)的硬體電路。
在MS-DOS中使用區段和位移兩個暫存器來指定某一個位址,每個區段有64 KB的大
小,位移值則是用來在一個區
段內指定更精確的位址。若我們要以區段和位移的組合來表示一個位址,則要將區段值先
乘上16,再和位移值相加,
得到的便是唯一的線性位址。
例如我們以資料區段暫存器DS配合存放位移的SI暫存器來指定一個位址,其內容分別為
0x7919和0x9518,則實際的線性
位址計算方式如下:
0x7919乘以16(或是向左位移四個位元),得到0x79190,再將這個結果與0x9518相加,得
到線性位址0x826A8的結果。
因為使用區段加位移表示法表示出來的位址不是唯一,所以上述的線性位址我們仍可用區
段0x826A,位移0x0008或區
段0x8200,位移0x06A8等不同的方式來表示。
在程式設計領域當中,一個陣列的索引值,也可以稱為offset。例如一個陣列元素A[10],
陣列A必定有一個起始位址
,若每一個元素的大小是兩個位元組,則A[10]的offset則為20個位元組,代表A[10]的位
址是A的位址加上20個位元組。
Q&A: 一行指令在電腦內部執行過程,有三種位址型態,請問是哪三種??是敘述三者的差別!!
邏輯位址、線性位址、實體位址。邏輯位址是指程式碼的相對關係位址,透過記憶體管理(Memory
Management)功能的分節單元轉換成cpu可以定址的線性位址,再藉由記憶體管理功能的分頁單元對
應到實體記憶體位址。
====================================================================
絕對位址代表某個記憶體位置的唯一的一種表現方式。因為在IBM-PC個人電腦中,記憶體位址是由區段 (segment) 和位移 (offset) 所組合而成的,不同的區段和位移的組合,事實上可能代表同一個位址,所以此時的位移是區段的『相對位址』(relative address),這是因為真正的記憶體位址還要依區段值而定。反之,不必參考別的數值,而僅由一個數值所組成的位址稱為『絕對位址』。
例如位址3FFC:0040(區段3FFC,位移0040),轉換成絕對位址的計算過程如下:
將區段值乘上16倍,得到3FFC0(16進位)。
將上述結果和位移值相加:3FFC0+0040=40000,這便是絕對位址40000。
如上例,該位址又可表示成區段和位移的相對位址組合4000:0000或3FFF:0010。因為40000+0000=3FFF0+0010=40000。電腦系統有絕對位址與相對位址的概念來自於PC/XT(8088 CPU) 與MS-DOS,因為在16位元的電腦系統時代 (包含8088/80286),CPU內部的暫存器是16位元,這表示它可以儲存四個16進位數字 (0000到FFFF),但硬體卻可以支援1 MB的記憶體 (00000到FFFFF),因此需要以兩個暫存器 (區段暫存器與位移暫存器) 來表示一個記憶體位址,於是Intel的硬體工程師便將區段暫存器乘以10進位的16(或是16進位的10,即將區段暫存器左移4個位元),再和位移暫存器相加,來表示記憶體的絕對位址,這種方式可以表達20個位元,因此可以定址到2的20次方,也就是1024 KB,即1 MB。
在目前電腦系統的CPU內部,由於所有的暫存器都已經是32位元,因此硬體上不需要以兩個暫存器來代表一個位址,便可以定址到4 GB(2的32次方),但是由於為了和許多MS-DOS與Windows 3.1時代的16位元應用程式 (許多都是以組合語言撰寫的) 相容起見,因此在80386以後的CPU也提供一個模擬8088的作業模式 (virtual machine),讓CPU能夠以8088時代的位址表示方式工作,以便讓以往的應用程式繼續使用,事實上硬體系統已經不需要此套轉換位址的模式,而改以較容易理解的平滑定址模式 (flat addressing mode),所有位址都只有一種表示方式。