RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么叫偏移地址_偏移地址怎么計算

姚小熊27 ? 來源:網(wǎng)絡(luò)整理 ? 2018-04-16 09:42 ? 次閱讀

什么叫偏移地址

偏移地址就是計算機里的內(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時,得到的成員變量地址就是它的偏移量。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 偏移地址
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    7453
收藏 人收藏

    評論

    相關(guān)推薦

    rt-thread studio地址偏移怎么配置?

    rt-thread studio地址偏移配置,這個再哪配置?
    發(fā)表于 02-23 06:24

    使用sizeof 進行地址偏移出現(xiàn)問題

    下所示,定義了兩個結(jié)構(gòu)體, 然后使用宏 定義了一個地址, 地址通過 sizeof 結(jié)構(gòu)體 進行地址偏移, 結(jié)果通過打印 這些地址,發(fā)現(xiàn)
    發(fā)表于 10-26 09:43

    怎么理解基地址偏移量的概念?

    你好,我很難理解NOR Flash中的基址和偏移的概念?如果你能幫助我了解銀行背后的想法,基礎(chǔ)地址偏移將是巨大的。我正在嘗試基于ARM處理器和MPED對Flash進行讀寫。如果你能給我提供一個C或
    發(fā)表于 11-08 16:53

    缺少用戶IP偏移地址或基地址

    嗨,我在塊設(shè)計中使用用戶IP,其中包含'NGC',用戶IP具有AXI的主從接口,但在地址編輯窗口中我缺少用戶IP偏移地址或基地址。請幫幫我。謝謝
    發(fā)表于 04-08 09:31

    如何將Bram的偏移地址修改為1?

    嗨,我想用Bram存儲二萬個數(shù)據(jù)。 Bram的偏移地址必須是存儲的四個的倍數(shù)。例如, Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + count
    發(fā)表于 05-07 09:24

    stm32的每個寄存器都有地址偏移是什么意思

    stm32的每個寄存器都有地址偏移,是什么意思?還有每個寄存器映像問題?
    發(fā)表于 05-28 04:35

    地址已經(jīng)可以區(qū)分了,加一個相同的偏移地址有何意義?

    `基地址已經(jīng)可以區(qū)分了,加一個相同的偏移地址有何意義?`
    發(fā)表于 02-02 13:55

    STM32基地址偏移地址以及寄存器地址之間有什么樣的聯(lián)系

    位待操作及地址STM32地址地址、總線地址、寄存器地址是什么基地址以及
    發(fā)表于 02-24 06:29

    每個寄存器之前寫入的偏移地址到底是什么意思

    我有一個 Nucleo L476RG,用于不同的項目,我從來沒有重視參考手冊中每個寄存器之前寫入的偏移地址。任何人都可以向我解釋這些抵消是什么。
    發(fā)表于 12-06 08:41

    AT32F4系列FLASH擦寫操作的地址偏移說明

    AT32F4系列FLASH擦寫操作的地址偏移說明擦除或者編程flash 時,如果操作地址不在flash 絕對地址范圍內(nèi),則操作會失???
    發(fā)表于 10-23 08:24

    段/偏移/物理地址

    地址:8086CPU將1MB的存儲器空間分成許多邏輯段,每個段最大限制為64KB, 段地址就是邏輯段在主存中的起始位置。為了能用16位寄存器表示段地址,8086規(guī)定段地址必須是模16
    發(fā)表于 06-30 10:39 ?2254次閱讀

    一文看懂匯編語言中有效地址偏移地址的區(qū)別

    本文開始對匯編中偏移地址的定義進行了介紹,其次介紹了有效地址的概念以及如何由有效地址求得物理地址的方法,最后介紹了有效操作
    的頭像 發(fā)表于 04-16 09:55 ?4.2w次閱讀
    一文看懂匯編語言中有效<b class='flag-5'>地址</b>和<b class='flag-5'>偏移</b><b class='flag-5'>地址</b>的區(qū)別

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

    有時候,我們不想讓程序存儲在起始的位置,比如我們有一段bootloader,對應的app(應用程序)存儲的位置就會有一個偏移地址。 那么,我們?nèi)绾巫尦绦虼鎯υ谥付ǖ?b class='flag-5'>偏移地址呢? 下面結(jié)
    的頭像 發(fā)表于 04-02 11:10 ?1w次閱讀
    Keil、IAR中如何讓程序存儲在指定的<b class='flag-5'>偏移</b><b class='flag-5'>地址</b>?

    stm32位帶操作及內(nèi)存地址

    位待操作及地址STM32地址地址、總線地址、寄存器地址是什么基地址以及
    發(fā)表于 01-12 18:21 ?1次下載
    stm32位帶操作及內(nèi)存<b class='flag-5'>地址</b>

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

    有時候,我們不想讓程序存儲在起始的位置,比如現(xiàn)在有一段bootloader,對應的app(應用程序)存儲的位置就會有一個偏移地址。那么,如何讓程序存儲在指定的偏移地址呢?
    發(fā)表于 07-10 10:38 ?1003次閱讀
    如何讓程序存儲在指定的<b class='flag-5'>偏移</b><b class='flag-5'>地址</b>呢?
    RM新时代网站-首页