竹林边的预言 发表于 2012-12-18 21:46:42

段地址、偏移地址跟物理地址的问题,本人已经入死区,求助

我们都知道段地址x16+偏移地址=物理地址,那么“段地址:偏移地址” 这样的表达法,如 0 :200 这个表达法中在一个寄存器的存储空间(如ax寄存器)中指的是哪一段?如上面的 0 :200 可以以20 :0 这样表达的物理地址,那么这个物理地址最大是多少?如0:200 物理地址在储存数据时是不是以偏移地址200存储单元开始存储?那它什么时候结束,是不是偏移地址到ffff就结束了?如果是20:0这样的偏移地址,在存储数据时是以偏移地址o 开始,它到最大的时候是ffff,那么假若把段地址与偏移地址当成数据来看,段地址比偏移地址大的存储方式与段地址比偏移地址小的方式存储有什么区别?还是它们没有区别!如果把他们换成物理地址(如00200)这样的话,在我看来没有区别!我越来越矛盾了!:'(:'(

haobing021 发表于 2012-12-19 10:04:33

楼上可以参考一下中山大学的视频教程,里面关于寻址方式的内容讲的不错,你看看估计就能解除你的疑惑了

逍遥一游 发表于 2012-12-19 19:04:40

      怎么说呢,8086地址线有20根,所以可访问的地址是2^20也就是1M,但是寄存器却只有16位,可访问的地址2^16也就是64k。一个16位的地址是访问不到所有空间的。所以呢,我们将20位的地址分成两份,也就是所谓的 段地址:偏移地址。
      按照上述方式如何得到20位的地址呢?我们所采取的方法是:计算的时候先把段地址(16位)左移4位(这样就有了20位),然后加上偏移地址。
         比如说:0x0010 : 0x0200 所访问的地址为0x00100+0x0200也就是0x00300。
         你也许会想,若以 段地址: 偏移地址的形式访问空间,有的地址岂不是会超出1M的空间?
         比如0xffff:0xffff = 0xffff0+0xffff = 0x10ffef这就超出1M范围了。
实际上当程序员给出超过1M(100000H-10FFEFH)的地址时,使用8086cpu的系统并不认为其访问越界而产生异常,而是自动从0开始计算,也就是说系统计算实际地址的时候是按照对1M求模的方式进行的,比如地址0x10ffef会转化为0xffef。
       好好学习吧,学好汇编好处很多的!

更替的四季 发表于 2012-12-19 19:15:18

0:200与20:0所指的存储单元确实是一个,不要太纠结了

Acxy 发表于 2012-12-20 20:46:05

这其实就像那个图。。。学校。图书馆。便利店。小明家。。你在学校要到 小明家。。可以说是:先到便利店。在到小明家。。也可以说是先到图书馆。经过便利店在到小明家。。。目的地是一样的。。

落叶无痕 发表于 2013-4-24 18:05:22

路过看看呵呵

pmymy 发表于 2013-4-25 01:10:31

{:1_1:}看看

小时候 发表于 2013-4-25 08:49:06

当你用DEBUG 查看内存的时候0000:0000这个段中从地一个00开始从左向右数

0000:0000   00 00 00 00 00 00 00 ~~00 00
所对应的位号   0   1   23   4   5   6~~E   F

当进入下一段的时候

0000:0010   00 00 00 00 00 00 00 ~~ 00 00
                     1011

当你取值的时候你想去4位的值   你可也   0000:0004(0000段 偏移地址为4)

当你想取 10位的值的时候            你可以0000:0010(0000段 偏移地址为10)

但是 他同时又可以理解为      0010:0000(0010段 偏移地址为0)

我建议你去DEBUG上好好体会一下

我开始的时候和你一样   但反复实践几次   就懂了

vitamin 发表于 2013-4-25 10:08:35

地址对于cpu来说,如何表达都无所谓,结果是一样的。
页: [1]
查看完整版本: 段地址、偏移地址跟物理地址的问题,本人已经入死区,求助