鱼C论坛

 找回密码
 立即注册
查看: 3376|回复: 4

[技术交流] [转载]第四篇 教材中关于程序计数器PC和 指令指针IP描述的原理性错误

[复制链接]
发表于 2014-2-6 17:03:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 skyonline 于 2014-2-6 17:04 编辑

当初学习x86汇编时只知道指令指针ip,这几天为了开学后的三级嵌入式认证考试正在自学第二章的arm汇编看到了程序计数器pc,而且处理的时候一直以为这个就是x86里面的Ip。结果查阅arm汇编手册是发现了一个让我震惊的事实:


寄存器名字
Reg # APCS  意义
R0a1工作寄存器
R1a2
"
R2a3
"
R3a4
"
R4v1必须保护
R5v2
"
R6v3
"
R7v4
"
R8v5
"
R9v6
"
R10sl栈限制
R11fp桢指针
R12ip
R13sp栈指针
R14lr连接寄存器
R15pc程序计数器

居然R12寄存器叫做ip!

于是我糊涂了……

经百度后得一篇博文,不敢私藏,在此分享给大家。







第四篇  教材中关于程序计数器PC指令指针IP描述的原理性错误

  杨成安

(开封大学信息工程学院,河南  开封 475000)

摘要:本文论述了全国计算机专业《微机原理、接口电路和汇编语言程序设计》教材中,关于程序计数器PC和指令指针IP描述的原理性错误,指明其重要性和正确的定义,以期培养学生正确的编程能力。

关键词:程序计数器PC  指令指针IP  程序断点

、问题的提出

       PC寄存器的名称为程序计数器,IP寄存器的名称为指令指针。我们现在来看一下二者在各版教材中的功能描述。(文中的注和下划线,为论文作者所加)

    1.谭版关于IP功能的描述

       谭浩强主编,清华大学出版社2001年出版《微机原理与接口电路》教材。

(1)谭版关于控制转移指令的描述:

       86页:直接寻址方式:

      段内直接寻址方式是目标程序和源程序在同一个程序段内,只给出源地址和目的地址的差值,此差值是偏移量,它是一个以IP为基准的8位或16位的带符号补码数。(注:能以IP为基准吗?)

      段内转移指令:

      段内直接短转移JMP  SHORT  OPR ;    (IP)←(IP)+ 8位偏移量

    段内直接近转移JMP  NEAR  PTR  OPR; (IP)←(IP)+ 16位偏移量

      (注:(IP)是断点吗?)

       86页:[4.34]

      已知下列程序段,请计算其中转移指令的偏移量。程序如下:

    1000 :1002H  LOOP  :SUB  AH ,23H

                               :

                               :

    1000 :1008H  JMP  SHORT  LOOP1(LOOP)

                               :

                               :

    1000 :1020H  LOOP1 :ADD  AH ,AL

    当转移指令目的地址用符号LOOP1表示时为正向转移,其偏移量e为正数;

    偏移量 e=(IP)目的 -((IP)源+2)

            =1020H - (1008H+2)

            =1020H - 100AH

            =16H                  

      (注:IP)源 = 1008H

      当转移指令目的地址用符号LOOP表示时为反向转移,所得偏移量e为负数:

    偏移量 e=(IP)目的 -((IP)源+2)补码

            =1002H - (1008H+2)补码

            =1020H - 100AH

            =(-8)补码 = F8H                  

      (注:IP)源 = 1008H

89页:循环控制指令

注意:执行循环控制指令时,将完成(IP)←(IP)+ 8位位移量(符号位扩展到16位)的操作。(注:IP)是断点吗?

90页:子程序调用及返回指令

段内间接调用CALL  DST ;(SP)←(SP)- 2

                         ;((SP)+ 1,SP)←(IP)

                            IP ←(EA)

                                  (注:压栈的是断点吗?

段内返回     RET ;   (IP)←((SP)+ 1 ,(SP))

                        (SP)←(SP)+ 2

                                  (注:返回的是断点吗?

99页:中断指令

外部中断  INT  TYPE;

                  … ((SP)+ 1 ,(SP))←(IP)

中断返回  IRET ;  (IP)←((SP)+ 1 ,(SP))

                      (注;压栈和返回的是断点吗?

2.陈版关于IP的描述:

陈卜锁主编,上海交通大学出版社2005年出版《微型计算机原理及其应用》(第二版)。

第19页:“指令指针IP的内容反映了程序的执行顺序,所以又称程序计数器PC(Program Counter)。”(注:IP = PC

3.周版关于IP的描述:

周明德编著,清华大学出版社1991年第二版《微型计算机  IBM PC/XT(0520系列)系统原理及应用》

仅举一例:第87页CALL

本指令是子程序(或过程)的调用命令,在调用结束后,要由所调用的子程序中的RET指令,返回CALL指令的下一条指令。为了能保证正确返回,就需要把断点(即CALL指令的下一条指令的地址)入栈保护。

对于一个段内的直接调用CALL。堆栈指针减2,使IP(指令指针)入栈。(注:理论要求把断点入栈,实际却是(IP)入栈,(IP=断点

第88页:RET

一个段内的返回指令,只返回主程序断点处的指令指针值,即把SP所指的堆栈顶部的一个字的内容弹回到指令指针,且SP加2。

、问题的分析

                      新版本高科技的“刻舟求剑”

       1.指令指针IP等同于程序计数器PC吗?

       根据前文中陈版的论断,“指令指针IP又称程序计数器PC”。给二者划了等号。真的如此吗?

       我们先来看看什么是程序计数器PC!根据冯·诺依曼机思想:“用指令事先编好的程序连续存放在内存程序区中,靠地址+1的方法连续取指执行”。在八位机8080CPU中是采用先取指后执行的串行操作的原理,而其中执行地址+1指令寻址的部件就是程序计数器PC。那么在程序的执行过程中,PC始终是指向下一条要执行的指令。结论:PC中的地址就是需要转移、循环、调用子程序和中断子程序等操作时的断点。

       我们再来看看什么是指令指针IP?在向上兼容的十六位机8086CPU中首先分为两个功能部件,即总线接口部件BIU和执行部件EU,BIU负责取指令,EU负责译码执行。并且当BIU执行指令排队栈中的六个字节装满后,(8088CPU是4个字节),EU开始从指令排队栈的出栈口,取指令进行译码执行,同时BIU并行操作向入栈口补充一条取指令命令。指令指针IP则是指向下个条要取指的指令,而不是EU要执行的指令。而断点则应该是要执行的指令内存地址,而不是IP内的下一条要取指的指令地址,而且(IP)比断点超前了六个字节(8088CPU超前四个字节)。

       结论:IP中并不是需要作转移、循环、调用子程序、中断子程序等操作时的断点。

       从上述两个结论来看,已经很清楚。第一,IP≠PC。第二,IP中不是断点的地址。但是无论谭版、陈版,还是周版,甚至国内所有有关教材,在压栈保存断点时都是压栈IP内容,甚至还明文讲到以IP为标准,但IP距离要压栈保存的真正断点超前了六个字节,这是不是一个新版本高科技的“刻舟求剑”的故事呢?

    2.根本原因在于偷换概念

       所谓偷换概念,用哲学的观点分析就是:抽象的肯定,具体的否定;理论的肯定,实际的否定;表面的肯定,暗地的否定!在科学的问题中,偷换概念是最讨厌的,莫说学生就是连老师也很难发现。而且这个错误是最普遍、最容易产生的,恐怕连作者本人也根本意识不到!

       教材中都是虽然表面承认8086CPU中IP已经预取6个字节,但在实际操作中却仍然当作PC来使用,把已经预取给忘掉了。甚至有人还干脆认为IP就等于PC。

       人类在研究自己的历史时,往往少不了考古。我们要想研究科学问题,怕也是要追根求源,考一考“古”吧!讲是十六位机时也是要了解八位机结构原理的。我在教学中也常爱用这样一句话:“扒皮抽筋,入骨三分“!

       注:顺便提一下,前文中引用的各版本中指令的注释字段亦有原理性错误,这在第三篇论文中已做论述。例(IP)← XX内容,但这里只能是IP的地址,加括号反而变成IP中的内容毫无意义了。

、问题的影响

                      返回不了断点的编程能力还能编程吗?

       教材中连真正的断点都找不到,培养出的计算机专业的学生能学会编程吗?

       科学的问题容不得半点虚假和误差的,恕我等直言。现抛砖引玉,请批评指正!

参考文献:

[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年毕业于吉林大学计算机科学系系统结构专业,师从于王湘浩先生。现任开封大学信息工程学院教授,主要从事计算机专业基础教学和科研、主攻方向计算机系统结构,荣获日内瓦国际专利博览会金奖,日内瓦世界发明家公会会员等。





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-7 10:13:31 | 显示全部楼层
读完了,顶一个!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-7 10:14:02 | 显示全部楼层
要是楼主R0 到 R15的具体功能列出来就好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-7 14:15:38 | 显示全部楼层
教材中关于调用子程序和中断子程序现场保护描述的原理性错误

杨成安

(开封大学信息工程学院,河南  开封 475000)


摘要: 本文论述了全国计算机专业《微机原理、接口电路和汇编语言程序设计》教材中关于调用子程序和中断子程序中现场保护描述的原理性错误。指明了二者的不同性质,并试图给出了不同的、正确现场保护与现场恢复的思维方法。
关键词: 调用子程序,中断子程序,现场保护,现场恢复,入口参数,出口参数
一、问题的提出
1.关于调用子程序现场保护的描述(注:文中下划线为本文作者所加)
①谭浩强主编,清华大学出版社,2001年版《微机原理与接口电路》,第97页
现场保护和返回
    所谓保护现场就是主程序执行CALL指令之前,主程序使用的某些寄存器,在子程序中也要使用,因而在进入子程序之初,首先将这些寄存器的内容保护(压栈)起来,以免子程序中重复使用这些寄存器,破坏主程序的执行结果。恢复现场就是在子程序返回前,将原来保护的数据重新返回(出栈)相应的寄存器……
②谭版P97举例:
[例4.48]
子程序名:PZN
子程序功能:统计一组数据中的正数和零的个数。
入口参数:数组首址在SI中,数组个数在CX中。
出口参数:正数个数在AX中,零的个数在BX中。
使用的寄存器:AX、BX、SI、PSW(注:使用的寄存器漏掉了CX!)
子程序如下:
PZN:PUSH    SI   ;保护现场
     PUSH    CX   ;
           :
           :
     POP     CX   ; 恢复现场
     POP     SI   ;
     RET
③谭版举例:共12个调用子程序举例
    P127~P141  [例:5.42]~[例:5.53]
2.关于中断子程序现场保护的描述
①谭版第188页描述
    保护现场是把CPU转入中断服务程序前所使用的有关各寄存器的内容和标志位的状态,用PUSH指令压入堆栈保护起来。中断服务结束后,再POP指令弹出,恢复中断前各寄存器的内容和标志位的状态。
②谭版第188页图8.11
③引用谭版举例第255页[例:9.4]
    中断服务程序
ORG  1200H
CLI             ;关中断
MOV  AL,[DI]
OUT  DX, 02F0H
INC  DI
DEC  AH
STI             ;开中断
IRET

④谭版256页[例9.5]及293页[例:9.10](略)

二、问题的分析
1.关于调用子程序现场保护错误的分析
①谭版中第97页描述的错误
    谭版认为调用子程序应在“进入程序之初”,进行现场保护,而且“在子程序返回前恢复现场”,错误在于“绝对化”,即应该视入口参数和入口参数的不同,而有不同的保护和恢复现场,理由请看下文结论。
②谭版[例:4.48]错误分析
    1>题目中,使用的寄存器漏掉了CX,丢三拉四是编不了程序的!
    2>在PZN子程序中,按谭版前边所述理论,首先保护了SI和CX,但保护的是主程序中的内容吗?而题目中已注明,SI和CX中是入口参数,则必然在主程序中调用PZN子程序前,要先赋两个入口参数,那么此时在主程序中并没有保护SI和CX(因为谭版认为应在子程序执行中保护现场!)而主程序中原来SI和CX中的内容却已经丢失了!
    同理,恢复现场的POP  CX和POP  SI指令,恢复的只能是原来的入口参数,并不是主程序应保护的内容。故而证明主程序中SI、CX内容确已丢失!
    3>题目中是注明PZN子程序中还使用到AX、BX及PSW状态字。
    莫名其妙,根本就没有进行保护!
    4>所以我们认为,调用子程序中所用到的寄存器在使用寄存器做参数传递方法时是根本不能在子程序中保护的。
    5>综观谭版[例:5.42]~[例:5.53]共12个调用子程序的举例,都犯同样的错误!
2.关于中断子程序谭版现场保护描述错误的分析
①谭版的第188页关于中断子程序现场保护的描述,仅仅给出用PUSH指令压入堆栈保护和用POP指令弹出恢复,而根本没有指明为什么要保护和怎样保护。
②谭版第188页图8.11中,在恢复现场前并没有进行关中断,即谭版认为恢复现场的过程中,是允许高级中断来破坏这恢复现场的过程的,显然是错误的,恢复现场应和保护现场一样应关中断,否则返回主程序时,照样会破坏原来寄存器的内容的!
③在上文中引用谭版第255页[例9.4]来看,中断子程序中根本就没有什么现场保护和现场恢复!为什么?
④是一时的笔误吗?非也,综观,谭版256页[例9.5]和293页[例:9.10]中的中断子程序,也都没有现场保护和恢复,这还是中断子程序吗?

三、问题的我见
1.关于调用子程序和中断子程序
①调用子程序的性质
    1>调用子程序是主程序的一部分,完成的是同一个算法。
    2>主程序对所调用的子程序是已知的,是主动的,是在主程序的固定位置调用的。
    3>主程序在调用子程序之前应先赋入口参数,调用后应处理出口参数。
4>参数传递(即入口参数和出口参数)的方法有三种,即CPU寄存器、内存数据区和内存堆栈区。
②参数传递方式不同则现场保护和恢复的方法亦不同。
    1>CPU寄存器参数传递方式中,由于主程序在调用子程序之前要对CPU寄存器赋入口参数,故此时已经被破坏了主程序原来的参数。故应在主程序中,赋入口参数之前压栈保护。同理,也应在主程序中,处理完出口参数后,出栈恢复现场。
2>内存数据区参数传递方式中,由于主程序无须动用CPU寄存器赋入口参数,故此方法可以在进入子程序之初保护那些子程序中用到的CPU寄存器内容!同理也可以在返回主程序之前恢复现场。
3>内存堆栈区参数传递方式,问题较难,故须小心使用,注意事项有:
a.由于主程序传递的参数压在堆栈中主程序断点的下面,故应采用堆栈分区的办法解决,即必须充分掌握改变SS或SP指针的技巧。
b.用堆栈参数传递,由于堆栈必须顺序入栈,且反顺序出栈,使用参数时难度也很大。
2.关于中断子程序
①中断子程序与主程序是风马牛不相及的两码事,完成的根本不是同一个算法。
②主程序对中断子程序是未知的,是被动的;中断是随机地在主程序的某位置产生的。
③故主程序根本无法在主程序中予赋参数、保护现场和恢复现场的。
④故中断子程序的保护现场和恢复现场只能在中断子程序中完成。
⑤而且在保护和恢复现场时,不能允许高级中断的产生,8086CPU在响应中断时,自动完成关中断(和保护PSW字即FR寄存器内容)故只有在恢复现场前须考虑再关中断的问题,而且应有两个关中断,即关中断和关单步中断。
⑥在中断子程序返回主程序后,请注意:主程序应是开中断状态,而这个任务在8086CPU中则是由IRET来完成了,该指令包括开中断的隐含操作。(而在8080和Z80CPU中则无此隐含操作,应在中断返回指令前加上开中断指令,否则主程序以后就无法再响应其它中断,而且这个问题会隐蔽的很深,不易发现!并且此开中断指令是延时在中断返回指令后实施的,否则将会产生未返回主程序,又响应其它中断而产生错误。)
⑦中断子程序参数传递只能在内存数据区中进行,并且也只能主程序初始化时完成。

四、问题的意义
    综上所述,汇编语言的编程问题很复杂,例如本文中的问题,单靠压栈和出栈是说不清楚的,也是会犯错误的!那么首先搞懂原理,再要有严格的逻辑思维能力,方能写出连一位0、1代码都不能错的可执行汇编源程序,站在高级语言层面上,来看待汇编语言的编程是行不通的。

参考文献:
[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年毕业于吉林大学计算机科学系系统结构专业,师从于王湘浩先生。现任开封大学信息工程学院教授,主要从事计算机专业基础教学和科研、主攻方向计算机系统结构,荣获日内瓦国际专利博览会金奖,日内瓦世界发明家公会会员等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-7 14:17:28 | 显示全部楼层
第五篇    教材中关于逻辑地址和物理地址描述的原理性错误
  杨成安
(开封大学信息工程学院,河南  开封 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的数据段中根本就不可能找到!
764 习题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年毕业于吉林大学计算机科学系系统结构专业,师从于王湘浩先生。现任开封大学信息工程学院教授,主要从事计算机专业基础教学和科研、主攻方向计算机系统结构,荣获日内瓦国际专利博览会金奖,日内瓦世界发明家公会会员等。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-25 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表