0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

姚小熊27 来源:网络整理 2018-04-16 09:42 次阅读

什么叫偏移地址

偏移地址就是计算机里的内存分段后,在段内某一地址相对于段首地址(段地址)的偏移量。偏移地址也称为偏移量,由于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

    浏览量

    7341
收藏 人收藏

    评论

    相关推荐

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

    rt-thread studio地址偏移配置,这个再哪配置?
    发表于 02-23 06:24

    使用sizeof 进行地址偏移出现问题

    下所示,定义了两个结构体, 然后使用宏 定义了一个地址地址通过 sizeof 结构体 进行地址偏移, 结果通过打印 这些地址,发现
    发表于 10-26 09:43

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

    你好,我很难理解NOR Flash中的基址和偏移的概念?如果你能帮助我了解银行背后的想法,基础地址偏移将是巨大的。我正在尝试基于ARM处理器和MPED对Flash进行读写。如果你能给我提供一个C或
    发表于 11-08 16:53

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

    嗨,我在块设计中使用用户IP,其中包含'NGC',用户IP具有AXI的主从接口,但在地址编辑窗口中我缺少用户IP偏移地址或基地址。请帮帮我。谢谢
    发表于 04-08 09:31

    如何将Bram的偏移地址修改为1?

    嗨,我想用Bram存储二万个数据。 Bram的偏移地址必须是存储的四个的倍数。例如, Xil_Out32(XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR + count
    发表于 05-07 09:24

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

    stm32的每个寄存器都有地址偏移,是什么意思?还有每个寄存器映像问题?
    发表于 05-28 04:35

    地址已经可以区分了,加一个相同的偏移地址有何意义?

    `基地址已经可以区分了,加一个相同的偏移地址有何意义?`
    发表于 02-02 13:55

    STM32基地址偏移地址以及寄存器地址之间有什么样的联系

    位待操作及地址STM32地址地址、总线地址、寄存器地址是什么基地址以及
    发表于 02-24 06:29

    AT32F4系列FLASH擦写操作的地址偏移说明

    AT32F4系列FLASH擦写操作的地址偏移说明擦除或者编程flash 时,如果操作地址不在flash 绝对地址范围内,则操作会失败?
    发表于 10-23 08:24

    段/偏移/物理地址

    地址:8086CPU将1MB的存储器空间分成许多逻辑段,每个段最大限制为64KB, 段地址就是逻辑段在主存中的起始位置。为了能用16位寄存器表示段地址,8086规定段地址必须是模16
    发表于 06-30 10:39 2009次阅读

    一文看懂汇编语言中有效地址偏移地址的区别

    本文开始对汇编中偏移地址的定义进行了介绍,其次介绍了有效地址的概念以及如何由有效地址求得物理地址的方法,最后介绍了有效操作
    的头像 发表于 04-16 09:55 4w次阅读
    一文看懂汇编语言中有效<b class='flag-5'>地址</b>和<b class='flag-5'>偏移</b><b class='flag-5'>地址</b>的区别

    Keil、IAR中如何让程序存储在指定的偏移地址

    有时候,我们不想让程序存储在起始的位置,比如我们有一段bootloader,对应的app(应用程序)存储的位置就会有一个偏移地址。 那么,我们如何让程序存储在指定的偏移地址呢? 下面结
    的头像 发表于 04-02 11:10 8354次阅读
    Keil、IAR中如何让程序存储在指定的<b class='flag-5'>偏移</b><b class='flag-5'>地址</b>?

    stm32位带操作及内存地址

    位待操作及地址STM32地址地址、总线地址、寄存器地址是什么基地址以及
    发表于 01-12 18:21 1次下载
    stm32位带操作及内存<b class='flag-5'>地址</b>

    如何让程序存储在指定的偏移地址呢?

    有时候,我们不想让程序存储在起始的位置,比如现在有一段bootloader,对应的app(应用程序)存储的位置就会有一个偏移地址。那么,如何让程序存储在指定的偏移地址呢?
    发表于 07-10 10:38 561次阅读
    如何让程序存储在指定的<b class='flag-5'>偏移</b><b class='flag-5'>地址</b>呢?

    Linux虚拟地址到物理地址转换过程

    虚拟地址到物理地址转换过程 虚拟地址和物理地址都被划分了两部分: 虚拟地址由虚拟页面号VPN和虚拟地址
    的头像 发表于 10-08 11:45 748次阅读
    Linux虚拟<b class='flag-5'>地址</b>到物理<b class='flag-5'>地址</b>转换过程