注册 登录
编程论坛 汇编论坛

汇编语言的分段的疑问

万士心平 发布于 2010-10-20 20:36, 1617 次点击
寄存器是16位 而偏移地址可以是十六位为什么还要分段呢?
 如果寄存器给的段地址为FFFF 而偏移地址为FFFF 则? 怎样
  为什么要分64K  我在网上和书上看到说8086寄存器只是16位只能表示这么多,我知道是2^16是65536 即64K 可我不理解的是
  既然可以加上偏移地址  为什么还是要分成64K 不是超过了吗?
  不好意思,讲这个的时候老师有点带过。。。不得不来这里麻烦大家了 !!
5 回复
#2
zklhp2010-10-20 21:58
这个的回答在本版很多次了 自己搜一下呗
#3
ONEPROBLEM2010-10-21 07:12
以下是引用万士心平在2010-10-20 20:36:42的发言:

寄存器是16位 而偏移地址可以是十六位为什么还要分段呢?
 如果寄存器给的段地址为FFFF 而偏移地址为FFFF 则? 怎样
  为什么要分64K  我在网上和书上看到说8086寄存器只是16位只能表示这么多,我知道是2^16是65536 即64K 可我不理解的是
  既然可以加上偏移地址  为什么还是要分成64K 不是超过了吗?
  不好意思,讲这个的时候老师有点带过。。。不得不来这里麻烦大家了 !!
我是这么理解你的看法的:认为一个寄存器是16位,已经能表示64K的范围,再加上偏移地址,岂不是64K+64K了吗?(不知道是不是这样?)
我觉得:8086CPU需要两个16位的寄存器来寻址,其中第一个用来表示内存中的某个“起点”,即某个范围开始的地方,然后第二个寄存器表示相对这个“起点”偏移多远。所以,它能寻址的范围(宽度)取决于表示偏移地址的寄存器的宽度。


[ 本帖最后由 ONEPROBLEM 于 2010-10-21 07:13 编辑 ]
#4
xiaomarn2010-10-21 21:01
8086的地址总线是20 位,可以传送20位地址,达到1mb的寻址能力,而8086cpu又是16位结构....只能传送16位的地址,寻址能力只有64kb.....(汇编语言-王爽)
为了达到寻址1mb的能力(20位地址线),就采用分段的模式,用两个寄存器表示一个地址,将1mb除以64kb刚好是16,也就是说我们只要十六个64kb(也就是16位寄存器)就行了,也就是说只要拿另外一个寄存器记录十六个段就行了,但我们都知道段寄存器都是16位的(64kb),如果每个数字都表示一个段,然后首尾相接再加到一起,算下,就是64k*64k,恩,太大了,远远超出我们的1mb了(我也知道越大越好,但谁叫我们的地址线只有二十位),办法就是段覆盖,想想扑克牌,我们要用几张牌形成一个两米的长龙,也许只要十六张牌(段)就行了,但现在我们牌多(有一副),还是要完成同样任务,就把他们相互重叠着展开(相当段覆盖)。。。
覆盖倒是可以,但是不能盖到一起啊(就像一副牌全缩到一起,长度也就一张牌长),所以相邻两个段至少也得相隔16字节,(16*64KB(段)=1mb),也就是为什么段起始要是十六的倍数

#5
万士心平2010-10-21 22:20
谢谢各位了   
#6
红成2010-10-30 11:45
.....不懂  不懂太深奥了
1