什么叫偏移地址
偏移地址就是計算機里的內(nèi)存分段后,在段內(nèi)某一地址相對于段首地址(段地址)的偏移量。偏移地址也稱為偏移量,由于8086/8088CPU內(nèi)部的ALU只能進行16位的運算,而8086/8088有20條地址線,直接尋址能力1MB。因此,8086/8088所使用的20位物理地址,是由相應的段地址加上偏移地址組成的。
偏移地址怎么計算
8086/8088有20條地址線,它的直接尋址能力為1MB。也就是在一個系統(tǒng)中可以有多達1MB的存儲器,地址從00000H—FFFFFH。給定任意一個20位物理地址,就可以從中取出需要的指令和操作數(shù)。但是8086/8088CPU只能進行16位運算。與地址有關(guān)的寄存器SP、IP、BP、SI、DI也都是16位的,所以對地址的運算也只能是16位的。對于8086/8088來說,無論采用哪種尋址方式,尋找操作數(shù)的范圍最大是2^16,也就是64K。如何才能形成20位的物理地址呢。系統(tǒng)先將1MB存儲器以64KB為范圍分成若干段。在尋址一個具體物理地址時,由一個基本地址再加上由SP或IP等可由CPU處理的16位偏移量來形成20位物理地址。
當系統(tǒng)需要產(chǎn)生一個20位地址的時候,一個段寄存器會自動被選擇。且自動左移4位再與一個16位地址偏移量相加產(chǎn)生所需的20位地址。
例如:數(shù)據(jù)段DS寄存器的值=0088H
偏移地址=22H
那么生成的20位物理地址等于00880H+22H=008A2H
段地址和偏移地址計算規(guī)律
左移4位就是16進制后面補一個0.
段地址=1F00H,偏移地址=1000H,
線型地址=1F000h+1000H=20000H
段地址=1F00H,偏移地址=1000H,
線型地址=1F000h+1000H=20000H
獲取C++類成員變量的地址偏移
經(jīng)常有人問怎么獲取類中的成員變量的地址偏移量,這個應該是很多初學C++的人很好奇的問題。以前我在學校的時候,也有過這種需求。忘了當時是要寫什么“奇怪的程序”了,反正需要獲取一個類的成員變量的地址偏移量。
其實這個問題很簡單,如果你了解C++的類對象內(nèi)存分布的話,這個根本不是問題。我給他舉了個例子:
structA
{
inti;
};
&((A*)0)-》i;//這樣就可以獲取到偏移量了。他表示不理解,OK,我們來具體說說。
假如定義個變量Aa;我們都知道&a表示變量a的首地址,&(a.i)表示變量i的地址,那么&(a.i)減去&a不就得到i的偏移量了嗎?
是的,就是這么簡單。那么這個例子&((A*)0)-》i;有什么關(guān)系呢?
&((A*)0)的地地址就是0,所以&((A*)0)-》i等于&((A*)0)-》i減去0。
有個網(wǎng)友更好奇了,為什么&((A*)0)-》i不會出問題?這個例子里并沒有為A的對象分配內(nèi)存,那怎么可以得到它的地址呢?
是的,這里確實沒有分配內(nèi)存,但是這個例子里我們并沒有要求有內(nèi)存,我們也不對內(nèi)存進行操作,所以不會引來崩潰。
&((A*)0)-》i只是借助編譯器為我們計算出它的地址。當編譯器要用要一個成員變量的時候,它會根據(jù)對象的首地址加上成員的偏移量得到成員變量的地址。當對象的首地址為0時,得到的成員變量地址就是它的偏移量。
-
偏移地址
+關(guān)注
關(guān)注
0文章
3瀏覽量
7447
發(fā)布評論請先 登錄
相關(guān)推薦
評論