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

Keil、IAR中如何讓程序存儲(chǔ)在指定的偏移地址?

如何讓程序存儲(chǔ)在指定的偏移地址呢?

評(píng)論