【求助】汇编语言的基础知识 (16位cpu寻址问题)

叁只技术宅 2018-07-29 10:58:39
作为一个伪业余计算机爱好者 今天买了本王爽的汇编语言书籍。

书中讲到了8086cpu 有16根地址总线 可以访问2的16次方=65536个存储单元,而每个存储单元可以存放8bit,即有64KB的寻址能力(不知道对不对 我是这么理解的。)

而书中说当时的cpu架构师想到了使用 段地址*16+偏移地址的算法
段地址*16 即转换为而进制就是本来的0000000000000000(16个0)~111111111111111(16个1)的寻址方式(65536个存储单元,64KB) 变为了 00000000000000000000(20个0)~11111111111111111111(20个1)(1 048 576个存储单元,1MB)。

我想问下当时cpu架构师提出 段地址*16+偏移地址的算法 为什么不提出 段地址*32+偏移地址的算法 (这样寻址能力不是更大吗?)

我想知道当时的局限性是什么 书中好像没有讲到 或者是我没有阅读到那一章节,让我心神不定,求大神用通俗语言解惑一下。
...全文
262 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SupermanTm 2018-08-19
  • 打赏
  • 举报
回复
首先,看历史背景,8086的年代,内存可是昂贵的玩意,2^20 = 1MB,当年的FPM(快速页面模式)内存1M上千块钱的,所以很少机器配置到1M的,偏移量采用30没有必要(至少在那个年代没必要);
其次,操作系统,PC的第一代操作系统是DOS,实模式下(不加载DOS3.0以后的HIMEM.SYS)只能支持640K,再大的地址空间也是没有意义的,事实上刚开始的时候640K--1MB的空间是ROM,里头包括了BIOS和一个简单的BASIC解释器;
最后的一个原因,程序员,8086的年代里,基础程序完全就是汇编语言写成的(C编译器就是用汇编写的),而汇编语言用的是16进制,那么一个字符(0..9; A--F)就是4bits,所以挪4bit的计算方法在编制程序的时候不容易出错,很多的规范事实上就是这样延续下来了。
Declan_ 2018-08-18
  • 打赏
  • 举报
回复
“书中讲到了8086cpu 有16根地址总线”就有错误,8086的地址线是20根,因此最大寻址空间是2^20 byte,也就是1M。但是8086的寄存器都被设计为16位,最大只有2^16,为了能够表示2^20才采用了段加偏移的方式表示。因为少了4位二进制位,所以段寄存器最少需要左移4位(左移3位不够),也就是*16来表示,也就是F000:FFFF就可以表示FFFFFH了。
最后正式回答你的问题,8086cpu的寻址空间根本是由20根地址线来决定的,采用段加偏移的方式只是为了能够表示20位的数,而不是说通过寄存器能表示的数的范围越大寻址空间就越大,事实上段*16+偏移能表示的最大数是FFFF:FFFF,但是这已经超出20位地址线能表示的范围了。而你说的用段*32+偏移也是可以的,但是完全没有必要,毕竟*16就能够表示20位的数了。
of123 2018-07-30
  • 打赏
  • 举报
回复
你再仔细想想。在地址线不增加的情况下,你的方案“范围”是扩大了,但存储空间丝毫没有增加。换句话说,你家的楼房是从 1 楼到 10 楼编号的,你把他改成 1 楼,100 楼,200 楼……,看着楼是“高”了,楼层还是那么多。

看书的时候,不要预设前人都是傻瓜,不要预设建立我们现在赖以发展的基础的人都不如你聪明,而且几代继承和使用这些成果的人都是傻瓜。
  • 打赏
  • 举报
回复
http://www.cnblogs.com/bingfengsa/archive/2012/06/08/3269351.html
  • 打赏
  • 举报
回复
https://blog.csdn.net/zhanglpql/article/details/15338653

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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