关于寻址范围的小问题

[复制链接]
3615|10
 楼主| qhw888666 发表于 2011-3-5 14:25 | 显示全部楼层 |阅读模式
我现在学习ucos-II邵贝贝翻译的那本。在第14章,ucos-II移植到80X86上。P333,最下方说,一个16位的段寄存器可以表示65536个不同的段,因此可以寻址1048576B???为什么呢,谢谢大家,第一次来此论坛,还没分呢
 楼主| qhw888666 发表于 2011-3-5 14:36 | 显示全部楼层
我觉得1048576B  应该是1048576个位吧,65536是2的16方,1048576是2的20方
batsong 发表于 2011-3-5 14:53 | 显示全部楼层
记得x86比较特殊,intel为了向前兼容,搞了个什么基址加偏移的寻址方式
53789 发表于 2011-3-5 18:09 | 显示全部楼层
一个16位的段寄存器可以表示65536个不同的段。

楼主的书上有没有说一个“段”是多少Byte呢?
 楼主| qhw888666 发表于 2011-3-5 21:59 | 显示全部楼层
早期的8086系列处理器 都是16位的,80486以后都是32位的了
highgear 发表于 2011-3-5 22:51 | 显示全部楼层
8086 是 16bit data bus, 20bit address bus. 只能用 32bit or 16bit 表示地址。8086 用 32bit 显然太浪费, 所以弄出了一个 段寄存器, 这样可以用 16bit 来寻址整个 1M 空间。一个段 64K,
段内 16bit寻址.
20bit 寻址为: seg:offset = (seg << 4) + offset
cai82119 发表于 2011-3-6 14:14 | 显示全部楼层
我觉得可以这样理解:16位段寄存器可表示的数为0--1111 1111 1111 1111b,十进制即为0至65535,一共是65536个数,所寻址到的是一个16位的数据,所以65536x16b=1048576b.
ayb_ice 发表于 2011-3-7 08:33 | 显示全部楼层
65536*16=1048576
刘前辈 发表于 2011-3-7 12:32 | 显示全部楼层
本帖最后由 刘前辈 于 2011-3-7 12:40 编辑

还是6楼所长说的靠谱:

8086是16位处理器,而8086CPU外部地址总线却可以有20位!这个20位物理地址实际上是:
16位段地址和16位偏移地址的合成。怎么合成的?这个合成器在CPU内部,很简单,把16位段地址左移4位,加上16位偏移地址就行了。举例:
一个20位物理地址0x12345=(段地址<<4) + 偏移地址;
有多种合成方法:
如果:    段地址=1000H   则 偏移地址=2345H
                             1200H                            0345H
                             1230H                             0045H
                              ……                              ……
显然,一个段的最大长度是16位偏移地址所寻址=64K。

         8051CPU一个段只有256字节?

gangei 发表于 2011-3-7 21:27 | 显示全部楼层
65536*16=1048576
highgear 发表于 2011-3-7 23:44 | 显示全部楼层
寻址1048576B, 并不完全准确,实际上 80x86 的实地址模式可寻址空间为 1114096B.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部