求助,高手,思考 为什么 8086 存储器最多分64个段 , 64个段,仅需要4位段基址就可以,为什么还要用16位表示,4位+16位(偏移量)=20位了

cvrli 2010-09-11 10:59:24
为什么 8086 存储器最多分64个段 , 64个段,仅需要4位段基址就可以,为什么还要用16位表示,4位(段基址)+16位(偏移量)=20位了。岂不是更好?
...全文
387 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mamamiya 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fzzhgj 的回复:]
引用 16 楼 wyjie1987 的回复:

TO fzzhgj

逻辑地址46位?

不懂。。


我只能推测式地给出你想要的答案:
首先,你需要清楚地知道,你自己引用了intel64位IA-32体系结构的开发手册;
然后,你引用的具体条目又是 3.3.1 IA-32 Memory Models

那么,你所用数据的上下文也就被限定在了 IA-32 保护模式的指令寻址……
[/Quote]
谢了~自己接着往下看吧
pandazhong 2010-09-21
  • 打赏
  • 举报
回复
懂楼主的意思,就是20位的地址只用20位的寄存器就行了,没不要用32位来表示(两个16位的是32位),同样迷惑。
fzzhgj 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wyjie1987 的回复:]

TO fzzhgj

逻辑地址46位?

不懂。。
[/Quote]

我只能推测式地给出你想要的答案:
首先,你需要清楚地知道,你自己引用了intel64位IA-32体系结构的开发手册;
然后,你引用的具体条目又是 3.3.1 IA-32 Memory Models

那么,你所用数据的上下文也就被限定在了 IA-32 保护模式的指令寻址中.
从而,在保护模式下intel 64位 IA-32 指令使用逻辑地址, 这个逻辑地址的长度也在手册中指出了: A logical address consists of a 16-bit segment selector and a 32-bit offset (see Figure 3-5)
这个我已经在12楼指出,你可能没看清.

16位段描述符 + 32位段内偏移 = 48 位

你要接着看手册, 你会找到, 其中这个段描述符其中14位用来寻址, 其它两位为标志位, 我在13楼有指出. 所以用作寻址的实际是46位.

总之, 你从手册找到的数据, 要回到手册中去找答案. 保护模式的东西不能跟实模式的比.
再多说一句, 保护模式下的段描述符不是用来直接寻址的,而是要与GDT配合等一系列操作才能得出内存中真正的地址,更多的东西需要你自己去研究查找资料了.
mamamiya 2010-09-14
  • 打赏
  • 举报
回复
TO fzzhgj

逻辑地址46位?

不懂。。
a691662 2010-09-13
  • 打赏
  • 举报
回复
intel工程师太天才了~
mamamiya 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shzhfu 的回复:]

80X86最多有64个段?好像没见过这样的说法。
[/Quote]
在Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual
Volume 1:Basic Architecture上面看到这么一句话:
Programs running on an IA-32 processor can address up to 16,383 segments of different sizes and types, and each segment can be as large as 232 bytes.
也就是说段的数量确实是由限制的。。但是不知道是怎么计算的
望高人求解
cvrli 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fzzhgj 的回复:]
To LZ

4位段地址,+16位偏移地址=20不是更好。

1. 6楼和8楼说出了这样设计的主要原因:历史决定了8086的设计师们采取了这么一个方案:16位段<<4 + 16偏移
2. 如果CPU其它方面,比如ALU等都不是问题了,就差这20位(1M)内存如何寻址,并且是你在设计,OK,你可以采用4位段 + 16位偏移的。也就是说理论上,这样也可以寻址1M。
此时,你这个设计:段4位……
[/Quote]


好的,解释
fzzhgj 2010-09-13
  • 打赏
  • 举报
回复
To LZ

4位段地址,+16位偏移地址=20不是更好。

1. 6楼和8楼说出了这样设计的主要原因:历史决定了8086的设计师们采取了这么一个方案:16位段<<4 + 16偏移
2. 如果CPU其它方面,比如ALU等都不是问题了,就差这20位(1M)内存如何寻址,并且是你在设计,OK,你可以采用4位段 + 16位偏移的。也就是说理论上,这样也可以寻址1M。
此时,你这个设计:段4位,则只能表示 16-1个段,且段大小就必须为64K上限(16位),否则不能寻址1M。

回过来,8086实模式的 16<<4 +16偏移,也就是段值低12位有效,此时可表示2的12次方个段,段大小也可以不必非要是64K,也可以寻址1M。

这只是一个方面吧,总得来说历史决定了很多东西...
fzzhgj 2010-09-13
  • 打赏
  • 举报
回复
3.4.2 Segment Selectors

15 2 1 0
---------------+----+-----+
| Index | TI | RPL |
---------------+----+-----+

16位中的14位段选由以上图示说明,其中1位为TI,还有1位为RPL。
fzzhgj 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wyjie1987 的回复:]

引用 9 楼 shzhfu 的回复:

80X86最多有64个段?好像没见过这样的说法。

在Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual
Volume 1:Basic Architecture上面看到这么一句话:
Programs running on an IA-32 processor can addr……
也就是说段的数量确实是由限制的。。但是不知道是怎么计算的...
[/Quote]

Intel® 64 and IA-32 Architectures Software Developer's Manual
Volume 3A: System Programming Guide
3.4
Even with the minimum use of segments, every byte in the processor’s address
space is accessed with a logical address. A logical address consists of a 16-bit
segment selector and a 32-bit offset (see Figure 3-5).
也就是说:CPU指令,逻辑地址有46位,其中14位(16K=16384)用于段选,32位用于段内偏移。
cvrli 2010-09-12
  • 打赏
  • 举报
回复
4位段地址,+16位偏移地址=20不是更好
masmaster 2010-09-12
  • 打赏
  • 举报
回复
实模式下物理地址是由16位段基地址左移4位再加上16位偏移地址形成。
mamamiya 2010-09-12
  • 打赏
  • 举报
回复
64个段,仅需要4位段基址就可以?
求解.

80X86最多有64个段 我也不知道,这个我还是第一次看到,希望有人能解释。
本人菜鸟,勿笑
shzhfu 2010-09-12
  • 打赏
  • 举报
回复
80X86最多有64个段?好像没见过这样的说法。
luzhiwei512 2010-09-12
  • 打赏
  • 举报
回复
重点那个地址加法器处理的运算是段地址X16+偏移地址,X16就是左移4位变成20位 ,所以段地址可以到2^20=1MB才能达到8086 20条地址总线寻址范围,偏移量只能0-64KB;

MHBBCRCPJ 2010-09-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 goodider 的回复:]
可以去看看我之前回复给 问:实模式和虚模式的帖子。其实这个是英特尔的天才工程师们想出的一个弥补硬件设计上的小问题的经典案例。
[/Quote]

http://topic.csdn.net/u/20100908/13/f2c5e8a2-e3c2-4577-a924-d8546ed73aa2.html#r_68240569

CSDN论坛的楼层定位锚点太复杂了,但还是被哥在源文件里找出来了.
luzhiwei512 2010-09-12
  • 打赏
  • 举报
回复
4位+16位地址还是16位
goodider 2010-09-12
  • 打赏
  • 举报
回复
可以去看看我之前回复给 问:实模式和虚模式的帖子。其实这个是英特尔的天才工程师们想出的一个弥补硬件设计上的小问题的经典案例。
luzhiwei512 2010-09-12
  • 打赏
  • 举报
回复
...要看那个加法运算器

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧