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