第五篇 教材中关于逻辑地址和物理地址描述的原理性错误 杨成安 (开封大学信息工程学院,河南 开封 475000) 摘要:本文针对当前《微机原理、接口电路和汇编语言程序设计》教材中,关于段结构逻辑地址和物理地址描述的原理性错误,进行了深入地讨论。试探给出了合理的解释,并指明了其重要意义。 关键词:段结构、逻辑地址、物理地址、段首址、段内偏移量、有效地址EA 一、 问题的提出 教材中有关段结构的原理性错误 1、谭版中有关段结构的描述 谭浩强主编,2001年清华大学出版社出版《微机原理与接口技术》。 1第33页:物理地址是指CPU和存储器进行数据交换时实际所使用的地址。它由两部分组成:段基址和偏移地址。 2第33页:20位物理地址的计算方法如图3.3所示。 图3.3 存储器物理地址的计算方法 3 第64页 习题2: 8088系统中存储器的逻辑地址和物理地址之间有什么关系? 4 第64页 习题3: 设段地址为4ABFH,物理地址为50000H,求有效地址是什么? 5 第64页 习题5 已知当前数据段位于存储器的B1000H到COFFFH范围,问DS寄存器的内容是什么? 6第64页 习题6 某程序在当前代码段中存有两个数据字1234H和5678H,若已知当前DS的内容为5AAOH,它们的偏移地址分别为245AH和246AH,试用图来说明它们在存储器中的物理地址。 7第64页 习题7 在8088系统中,已知当前SS寄存器的内容为2345H,SP的内容为0100H, 请说明该堆栈在存储器中的物理地址的范围。若当前堆栈中已存有10个字节的数据,那么SP的内容应该是什么数值? 2、陈版中有关段结构的描述 陈卜锁主编,2005年上海交通大学出版社出版,《微型计算机原理及其应用》第二版 第36页:8086/8088系统将 1M字节的存储器空间划分为若干段(称逻辑段),每段包含64K个字节。 二、问题的分析 段内偏移量能超过段首址规定的段寻址范围吗? 1、谭版中有关段结构的描述是错误的 1第33页中,物理地址应该是经20位地址加法器。加工处理后,送到20位地址总线上的20位实际地址。这是对的。而段基址(即段首址)和偏移地址(即段内偏移量)则应为逻辑地址(或称形式地址)的两部分组成。物理地址并不等同于逻辑地址。这里是不是偷换了概念?而且本书根本没有给逻辑地址这个重要概念,然而在后边的习题中却要考问学生,请问何意? 2 第33页中,20位物理地址的计算方法并没有给出文字说明,但从图3.3所示,以及该章后边的全部关于段结构原理的习题分析的结果来看,无一例外,谭版坚决认为:偏移地址(即段内偏移量)是能超过段基址(即段首址)所规定的段寻址范围的!换句话说谭版坚决认为当段基址和偏移地址在20位地址加法器中加法处理后,有效数字可以“叠加”,可以改变段基址的大小!这是完全错误的! 看来谭版作者根本不知道什么是段结构,和为什么在8086/8088CPU中设置段结构!这就如同一个班级能容纳40名学生,可你非要说是这个班上的第41名,这可能吗?请看以下对谭版全部有关段结构习题的分析! 3第64页 习题2的分析: 其一、谭版中根本没有给出“逻辑地址”这个重要概念。其二、在谭版第33页已经把物理地址混同逻辑地址的概念,即认为物理地址是由段基址和偏移地址构成的,已经是完全错误了,还要问二者有什么关系,是何用意?而物理地址应是20位实际地址。、 4第64页 习题3的分析: 其一、谭版中也根本没有给出“有效地址EA”这个亦然重要的概念,却又要考学生?有效地址EA就是段内偏移量中有效数字位,在计算20位物理地址时使用!(下文中将说明“有效数字”的定义) 其二、在段首址为4ABFH这个段中,物理地址是从4ABFOH到4ABFFH范围,仅有16个字节。根本没有也不可能有50000H这个物理地址,因为物理地址50000H应该是在段首址为5000H这个段中。而段首址4ABFH的段根本不能等同于段首址5000H的段! 5第64页 习题5的分析: 题目中讲的这个已知当前数据段,首地址为B1000H末地址到COFFFH,所求的这个DS段寄存器的内容是根本不存在的!因为首地址在以B100H为段首址的数据段中,末地址却在以COOOH为段首址的数据段中,首、末地址根本不可能在同一个数据段中!这该让学生如何来完成这样的练习呢? 6第64页 习题6的分析: 题目中讲的这个已知数据段段首址为5AAOH,两个偏移地址分别为245AH和246AH,原来是根本无法计算的,因为二者已超出段首址5AAOH的段寻址范围!若是硬要算,则物理地址分别为:5AAOH×24+245AH=5CE5AH 5AAOH×24+246AH=5CE6AH 请注意:二者所在的数据段已不是段首址为5AAOH,而都是在段首址5COOH的数据段中。也就是说这两个偏移地址在段首址为5AAOH的数据段中根本就不可能找到! 7第64页 习题7的分析: 题目中已知(SS)=2345H,而(SP)=0100H 请注意:这个堆栈段首址为2345H的段中,只能放下0000B到1111B共16个字节的。偏移量的地址,根本放不下0100H这个SP堆栈段内偏移量,因为0100H要求这个堆栈段应有29=512个字节的存储空间。还要请注意,所谓“段内偏移量”的定义,是在段首址所规定的段内范围以内,到段首址的距离字节数。 分析综述,以上的习题就是谭版中关于段结构的全部习题。看来没有一道习题是有道理的。更有甚者,第64页习题4中,竟然会让CS指向的程序代码能与DS指向的数据段重叠,竟然还要问重叠区为多少个单元?直接违反冯·诺依曼机思想,这个问题已在第一篇论文中论述。 2.陈版中有关段结构的描述亦是有错误的 陈版中把每个内存逻辑段都认为是64K字节,是毫无道理的!而应是24、25、……216,即16B、32B……64KB均可供选择的。看完本文下一段论述就会完全明白的! 三、问题的由来 8086/8088CPU为什么要采用段结构。 我们研究科学、要知其然,更要知其所以然。要多问几个为什么;看问题的方法要“扒皮抽筋,入骨三分”的。这里我们就要问一问,8086/8088CPU为什么采用段结构,其原理是什么? 追根求源,Intel的8位机8080CPU,数据总线DB为16位,地址总线亦为16位。那么这个16位地址信息也是要通过16位数据总线来传送,也是要在数据通道中的暂存器,以及在CPU中的寄存器和内存中存放的,但由于DB和AB此时位数相等,故不会产生矛盾! 但当上升到16位机后,Intel8086/8088CPU的设计,由于当年IC集成技术和外封装及引脚技术的限制,不能超过40个引脚。但又感觉到8位机原来的地址寻址能力 216=64KB太少了,但直接增加到16的整数倍即令AB=32位又是达不到的。故而只能把AB暂时增加4条成为20条。则220=1MB的寻址能力已经增加了16倍。但此举却造成了AB的20位和DB的16位之间的矛盾,20位地址信息既无法在DB上传送,又无法在16位的CPU寄存器和内存单元中存放。于是应运而生就产生了CPU段结构的原理。 首先我们要把教学的“有效数字”的概念应用到20位二进制物理地址中,有效数字位的数字可为1,也可为0,我们现在要把20位有效数字的物理地址分成两段,可以有多种分法。但要求这两段分开后,每段不能大于16位,也不能小于4位。如下图所示:共有13种分法。如此形成的高位有效数字和低位有效数字是互补的。
高位有效数字即为段首址,但要在其低位补上无效数字的零,仍然保持20位。然后右移四位,把低四位无效的零自然丢失,形成逻辑地址(或称形式地址)的十六位段首址。 20位实际地址中,低位有效数字即为段内偏移量,当不足16位时要在其高位补上若干无效的零。形成逻辑地址的十六位段内偏移量。 此低位有效数字亦称为有效地址EA。一般的讲,也可以粗略地认为段内偏移量就是有效地址EA。因为它们在数值上是相等的! 下面我们来分析一个这个由段首址和段内偏移量两部分构成的逻辑地址的性质: 性质一:如上所述形成的段首址和段内偏移量均为十六位,可以很方便的在数据总线上传送,及在CPU寄存器和内存单元中存放。 性质二:段首址即该段的内存首地址。段内偏移量则是该段的范围内距离段首址的字节数。 性质三:因为段首址的有效数字和段内偏移量有效数字是互补的,所以段的大小可以说是由段首址的有效数字决定,也可以说是由段内偏移量有效数字的长短决定。即段的取值范围是段内偏移量有效数字的长度从全0,然而末位加一,直至全一。 性质四:段的大小则可以是24、25、26……216即16,32,64……64K个字节。共有十三种大小不同的段可供选择。 性质五:当需要对内存寻址时,只须将段首址送入20位地址加法器中,然后左移四位,并且末位补上四个零,而后加上段内偏移量即可送到20位地址总线上。由此才将段首址和段内偏移量决定的逻辑地址变成20位物理地址! 性质六:请注意,这里的“加法”不是一般教材中所讲的“叠加”,段首址的有效数字和段内偏移量的有效数字位是不能重叠的!(“重叠”也正是如谭版中习题所出现的错误)二者只能是高低有效数字的“衔接”,只有如此才能复原20位物理地址的本来面目。否则,将会改变段首址的取值,超越该段的取值范围,而且也破坏了20位物理地址的本来面目。这才是段结构原理的真谛! 四、问题的意义 安排内存是汇编级编程的基本功。 众所周知,高级语言是用户级编程的工具,编程者根本不用了解计算机的内部构、原理和内存的安排,而是由功能强大的操作系统自动完成的。 然而,汇编语言及其机器代码语言则完全不同,是机器级编程的工具,编程者要全面的掌握计算机的内部结构、原理,而且自己要安排内存。如果是站在用户级的层面上,是理解不了计算机的,术业是要专攻的!这就看出段结构的重要性! 科学的问题是来不得半点虚假和误差的,恕吾等直言,现抛砖引玉,请批评指正! 参考文献: [1]《微机原理与接口技术》谭浩强主编 清华大学出版社 2001年9月1 [2]《微型计算机原理及其应用》陆一青编 哈尔滨工业大学出版社 1991年8月1日 [3]《微型计算机硬件软件及其应用》周明德编 清华大学出版社 1982年10月1日 [4]《计算机组成原理与汇编语言程序设计》俸远祯等 电子工业出版社 1997年6月2日 [5]《微型计算机》朱绍庐编 人民交通出版社 1983年 5月 [6]《微型计算机1BM—PC/XT(0520系列)系统原理及应用》周明德 清华大学出版社1991年7月 [7]《微型计算机原理及其应用》 陈卜锁主编 上海交通大学出版社 2001年1月 [8]《微型计算机组成原理与接口技术》 赵佩华等编 西安电子科技大学出版社 2001年8月 [9]《微机系统与接口技术》 吴产乐主编 华中科技大学出版社 2002年1月 作者简介:杨成安(1947-),男,北京市人,任课题组组长,1982年毕业于吉林大学计算机科学系系统结构专业,师从于王湘浩先生。现任开封大学信息工程学院教授,主要从事计算机专业基础教学和科研、主攻方向计算机系统结构,荣获日内瓦国际专利博览会金奖,日内瓦世界发明家公会会员等。
|