debug中查看内存:FFFF:FFFF时为什么还有内容?

来源:百度知道 编辑:UC知道 时间:2024/06/18 12:38:05
按照书上说20位地址总线,最大地址是FFFFF.
那么物理地址=段地址*16+偏移地址,
FFFF*16+FFFF=10FFEF
10FFEF大于FFFFF,这是怎么回事?
是不是如果按照8086的地址总线宽度是这样的,而现在的cpu不是?
如果说是现在cpu的地址总线提高了的话,那么我在debug中输入FFFFF:0为什么报错?

你用的不是286以前的产品吧,386以后的intel IA-32结构处理器都支持16位下的分段内存寻址模式,这是为了向后兼容,而现在在32或64位环境下编写16位程序(比如DOS程序)的时候,使用的是386以后CPU提供的"virtual 8086"(虚8086模式),只是一个模拟环境罢了,所以你在cmd里使用16位程序,比如debug时,你会注意到窗口有一些小的变化。这时其实已经进入了虚8086模式。模拟始终是模拟,自80386中的有一代开始,intel就是32根地址总线了,奔腾又多加了4根,现实中我们使用的是32位CPU,32位系统,平坦型的内存模式使程序可以在4GB的范围内寻址,奔腾可以大到64GB,所以当然可以寻到类似于10FFEF的地址咯。

所以现在的什么DOS程序都是在cpu的虚模式下运行,包括一些古老的C编译器比如TC2.0。

虽然DOS汇编老了点,但我觉得由此了解下cpu的发展还是很不错的,能为以后的32位汇编打下基础。

补充:那是因为debug是16位的程序,FFFFF已经大于了16位,所以debug当然可以发现这类明显的错误,但由段+偏移地址计算出的地址就不知道咯,具体要看它程序本身的实现,也有可能是16位程序移植到32位环境下做了某些改动所造成的结果吧,纯属猜想,仅供参考。