作者:孙东风2012-8-30     转载请注明出处

本文主要内容包括:

Р    冯·诺依曼体系结构

Р    汇编语言对冯·诺依曼结构的抽象

Р    面向过程语言对冯·诺依曼结构的抽象

Р    面向对象语言对冯·诺依曼结构的抽象

Р    程序架构设计与冯·诺依曼结构

1.1冯·诺依曼体系结构

1946年美籍匈牙利科学家冯·诺依曼提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式存储,并确定了存储程序计算机的五大组成部分和基本工作方法,如图1-1所示。

图1-1 冯·诺依曼体系结构

冯·诺依曼理论的要点是:数字计算机的数制采用二进制;计算机应该按照顺序执行程序。

如图1-1所示,冯·诺依曼定义了计算机的三大组成部件:

ü      I/O设备:负责数据和程序的输入输出

ü      存储器:存储程序和数据

ü      处理器:分成运算器和控制器,运算器负责数据的加工处理,控制器控制程序的逻辑

注意

传统的教科书上又把冯·诺依曼理论分成五部分:输入设备、输出设备、存储器、运算器和控制器。

计算机科学的历史就是一直围绕着这三大部件,从硬件革命到软件革命的发展史。从软件革命的历史来看,计算机科学一直围绕着数据、逻辑和界面三大部分演变,数据对应着存储器、逻辑对应着处理器、界面对应着I/O设备。

1.2汇编语言对冯·诺依曼结构的抽象

汇编语言是对冯·诺依曼结构最为直接的抽象,在汇编语言中只有三种操作对象:寄存器、存储器和I/O设备。

寄存器是处理器的主要组成部分,这些寄存器分别承担着运算器和控制器的角色,比如指令寄存器(IR,InstructionRegister)和段寄存器 (SR,Segment Register)负责程序的逻辑处理,而累加寄存器(AR,Accumulator Register)则负责程序的运算。

其中段寄存器是为了对存储器的分段管理而设置的,在16位的CPU中有四个16位段寄存器:

ü      代码段寄存器(CS,Code Segment)存放当前运行的程序代码所在段的段基址;

ü      数据段寄存处(DS,Data Segment)存放当前程序使用的数据所在段的段基址;

ü      堆栈寄存器(SS,StackSegment)存放堆栈段的段基址;

ü      附加段寄存器(ES,ExtraSegment)存放当前程序使用的附件数据段的段基址;

如果想使用汇编语言实现两个数的加法并输出十进制到屏幕,代码如下:

DATA SEGMENTSTR1 DB 'Please input the two numbers:',13,10,'$'STR2 DB 13,10,'$'STR3 DB 13,10,'Continue? [Y/N] ','$'FIRST DB 40 DUP(0);为被加数分配空间SECOND DB 40 DUP(0);为加数分配空间SUM DB 40 DUP(0);为和分配空间

DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09     INT 21H;显示字符串1 MOV SI,OFFSET FIRST+20;SI指向被加数地址中部 MOV BX,OFFSET SECOND+20;BX指向加数地址中部 MOV CX,00;CX初始为0INPUT1: MOV AH,01 INT 21H;输入字符 AND AL,0FH;转换成非组合的BCD码 MOV [SI],AL CMP AL,0DH;用回车判断是否输入结束 JE L1;输入结束,转L1 INC SI;输入未结束,则继续输入 INC CL;用CL为被加数的位数计数 JMP INPUT1

L1: LEA DX,STR2   MOV AH,09 INT 21H;回车换行    MOV DL,'+'    MOV AH,02     INT 21H;显示器输出字符'+' LEA DX,STR2 MOV AH,09 INT 21H;回车换行

INPUT2: MOV AH,01 INT 21H;输入字符 AND AL,0FH;转换成非组合的BCD码 MOV [BX],AL CMP AL,0DH;用回车判断是否输入结束 JE L2;输入结束,转L2 INC BX;输入未结束,则继续输入 INC CH;用CH为被加数的位数计数 JMP INPUT2

L2: LEA DX,STR2 MOV AH,09 INT 21H;回车换行  MOV DL,'=' MOV AH,02 INT 21H;显示器输出字符'=' AND AX,00H;AX置0 DEC SI DEC BX MOV DI,OFFSET SUM;DI指向和数 CLC;CF置0 CMP CL,CH;比较被加数和加数的位数 JGE L4;如果被加数位数不小于加数位数,转L4 JL L3;如果被加数位数小于加数位数,转L3

L3: MOV CL,CH     JMP L4

L4: AND CH,0;置CX为被加数和加数的位数中大的 INC CX;CX加1,考虑最高位可能进位 STD;置DF为1 JMP L5

L5: LODSB;被加数载入,SI自动递减 ADC AL,[BX];带进位的加法 AAA;十进制调整 MOV [DI],AL;将所加的数装入DI所指示的和处 INC DI;DI自增 DEC BX;BX自减 LOOP L5;循环

L6: DEC DI MOV DL,[DI] CMP DL,00H;首先判断最高位是否为0 JE L7;最高位为0,转L7 JNE L8;最高位不为0,转L8

L7: JMP L6;最高位为0,跳过

L8: INC DI;最高位不为0,重新开始 JMP L9

L9:DEC DI MOV DL,[DI] OR DL,30H;转换成ASCII码 MOV AH,02H INT 21H;输出和数 MOV AX,OFFSET SUM;将和数的地址偏移量装入AX CMP DI,AX;比较AX和DI,判断输出是否应结束 JE L10;输出完毕 JMP L9;输出未结束,继续输出

L10: LEA DX,STR3 MOV AH,09 INT 21H;询问是否需要继续进行 MOV AH,01 INT 21H CMP AL,59H;判断是否需要继续进行 JE L11 JNE L12

L11: LEA DX,STR MOV AH,09 INT 21H JMP START;继续进行

L12:  MOV AH,4CH INT 21H

CODE    ENDSEND    START

从上面的程序中可以看到,首先定义了数据段DATA SEGMENT并对存储器中的数据进行赋值,然后定义了代码段CODE SEGMENT,在冯·诺依曼结构中,数据段和代码段被统一放入存储器中并通过处理器的寄存器进行逻辑控制和运算,在需要通过I/O设备显示的时候调用INT中断程序输出到屏幕上。

那么就可以这样理解,汇编程序是对冯·诺依曼结构的最原始的抽象,汇编程序把数据、逻辑和显示进行了最原始的封装,使得程序员可以更方便的控制存储器、处理器和I/O设备,而不是和枯燥的二进制数据直接打交道。

1.3  面向过程语言对冯·诺依曼结构的抽象

在计算机科学的发展史上,计算机软件科学的发展围绕着这样一个趋势:如何对数据、逻辑和界面进行更深层次的抽象,使得人类可以更方便的控制存储器、处理器和I/O设备,从而极大的提供人类的生产效率。

1973年,Ritchie在开发Unix系统的过程中完成了C语言的第一个版本。

图3-1 C语言之父丹尼斯·利奇

C语言是对冯·诺依曼体系结构的最高层次的抽象,C语言让程序员可以从容的控制存储器、处理器和I/O设备,同样是计算两个数的加法,C语言的实现代码如下:

#include

voidmain()

{

int a,b;

printf(“请输入两个数字:”);

scanf(“%d %d”, &a, &b);

printf(“%d+%d =  %d\n”, a, b, a+b);

}

上面的代码中,int a,b就是程序的数据段,而整个main()方法就是程序的代码段,printf()方法和scanf()方法则对应着INT中断程序。

可以看到,C语言对冯·诺依曼体系结构的抽象更为高级,同时,C语言也通过对存储器、处理器和I/O设备的更高层次的抽象,使得开发过程中不需要再关心哪些是数据段,哪些是代码段,如何去控制处理器以及如何去操作I/O设备。在上面的程序中,数据段int a,b就位于代码段main()方法中。

C语言也是面向过程编程语言的代表,在C语言中,不需要再去关注存储器、处理器以及I/O设备,开发人员只需要对某一个具体的操作过程抽象,比如两个数的加法、两个数的减法以及其它的操作,都可以封装一个具体的方法,这些方法中不再区分数据段和代码段,也不再关注处理器如何和存储器、I/O设备之间交互。

1.4  面向对象语言对冯·诺依曼结构的抽象

从冯·诺依曼体系结构来说,面向过程编程语言的出现打破了存储器、处理器和I/O设备之间严格的功能界限划分,如图4-1所示:

图4-1 C语言面向过程编程

这种打破计算机系统结构限制的面向过程编程语言的诞生,在初期极大的提高了生产效率,使得开发人员从传统的面向系统结构编程的烦恼中解放了出来,开发人员不需要再去关心不同的硬件之间汇编指令的区别,也不需要再去关心硬件层次的数据、逻辑以及显示之间严格的界限。

随着软件系统复杂性的日益庞大,这种不再对数据、逻辑和显示进行严格区分的过程语言逐渐暴露它的缺陷,数据日益庞大、逻辑处理也日益复杂、界面又分散在各个过程函数中。毫无疑问的是,面向过程语言逐渐使得一些新的开发人员,特别是对冯·诺依曼体系结构知之甚少的开发人员的代码更加难以维护。

面向对象编程语言对冯·诺依曼体系结构的抽象更进化了一个层次,面向对象编程语言使得每个对象的存储、逻辑和显示区分开来,最终这些子对象组合在一起形成了复杂的计算机软件系统。

面向对象的出现,是对冯·诺依曼体系结构的一次回归,比如对一个人的抽象,Java代码如下:

public class Human {

public String _name;

public String _wugong;

Human() {

_name = "";

_wugong = "";

}

Human(String name, String wugong) {

_name = name;

_wugong = wugong;

}

}

在一个对象中,有这个对象的数据段和操作数据的代码段,而对象的大小就是数据段所占用空间的大小(不考虑占位字节),在实例化一个具体的对象之前,并不会占用数据段的空间,每一个具体的对象都会在数据段中占据空间。

面向对象编程方法的出现,是最接近人类的思维方式和冯·诺依曼体系结构的计算机科学。从更根本的层次上讲,面向对象是一种编程方法,这种方法接近人类的思维方式,也接近冯·诺依曼体系的结构,开发人员可以使用C、Java、C++甚至是汇编来实现面向对象的编程方法。

1.5  程序架构设计与冯·诺依曼结构

在计算机科学的发展历史中,一直围绕着对存储器、处理器和I/O设备的抽象,使得生产效率得到更大的提高。

冯·诺依曼体系结构的特点又决定了数据、逻辑和显示是注定要分离的,并且分离的越彻底,健壮性和可扩展性就越高。因为无论采用面向过程还是面向对象的编程方法,只要冯·诺依曼体系结构不发生变化,那么数据就注定要加载到存储器中、逻辑就注定要由处理器来控制、显示也必须让I/O中断来触发。

在计算机的发展历史长河中,架构设计越接近系统结构,那么健壮性和扩展性也就越强。自然界的规律概莫如此,这和一个社会的制度越符合民众需求就越稳固是一样的道理。如图5-1

图5-1 软件架构设计和系统结构

所以在软件架构设计中,如何让数据、逻辑和显示更彻底的分离,就成为衡量一个架构设计合理的标准,比如Struts+Spring+Hibernate框架。

同样,清晰的知道代码中每个部分的职责,也可以解释平时很多看起来很有迷惑性的问题,比如下面的代码:

#include"iostream.h " class Test{   int i;   public:     Test(){cout   < play(); }

上面的代码比较有迷惑性,play()方法中通过delete this;这行代码来删除当前对象所占用的内存空间是否会有问题?

如果能清楚的知道mTest对象的数据段和代码段是分离的,int i是mTest对象的数据段,它在mTest对象初始化的时候在数据段分配并占据4个字节的空间,而代码段是独立于对象之外的,mTest对象通过隐式的this指针调用play()方法,从而释放mTest对象所占用的内存空间,所以上面的代码是没有错误的,这种写法在com中被大量使用。

冯诺依曼计算机的发展过程,从冯•诺依曼结构看计算机科学的发展史相关推荐

  1. 冯诺依曼计算机的发展过程,从冯•诺依曼结构视计算机科学的发展史

    从冯•诺依曼结构看计算机科学的发展史 作者:孙东风2012-8-30     转载请注明出处 本文主要内容包括: Р    冯·诺依曼体系结构 Р    汇编语言对冯·诺依曼结构的抽象 Р    ...

  2. 从冯•诺依曼结构看计算机科学的发展史

    作者:孙东风2012-8-30     转载请注明出处 本文主要内容包括: Р    冯·诺依曼体系结构 Р    汇编语言对冯·诺依曼结构的抽象 Р    面向过程语言对冯·诺依曼结构的抽象 ...

  3. 计算机操作系统的发展过程

    5个发展过程: (一)无操作系统的计算机系统(真空管):     分为人工操作方式和脱机输入/输出方式两种方式: (二)单道批处理系统(晶体管):     其自动处理过程是:首先,由监督程序将磁带上的 ...

  4. 计算机软件系统发展历史,一文带你了解操作系统发展史

    大家了解过操作系统的发展史吗?在当下这个互联网时代,计算机已经成为了人类的生活必需品,而计算机操作系统的发展历史,也就代表着计算机的发展历史.今天贤集网小编为大家详细的整理了一份关于操作系统发展史的相 ...

  5. 关于计算机的发展过程及基础知识正确的是,2011doc-计算机基础知识.doc

    2011doc-计算机基础知识.doc 一.单选题 (每小题1分) . 计算机中,浮点数由两部分组成,它们是( ). A.整数部分和小数部分?? B.阶码部分和基数部分 C.基数部分和尾数部分?? D ...

  6. 在计算机网络应用发展过程中 被称为,计算机网络技术与应用第三章考试题

    计算机网络技术与应用第三章考试题 一.填空题 1.网络通信协议主要由3个要素组成:().()和(). 2.在网络层次结构模型中,N层是N-1层的(),同时又是N+1层的(). 3.1983年国际标准化 ...

  7. 冯诺依曼计算机体系在现代微机中的应用,冯诺依曼体系结构 冯诺依曼计算机的基本原理...

    冯诺依曼体系结构 冯诺依曼计算机的基本原理 冯诺依曼体系结构 冯•诺依曼是一位匈牙利籍美国人,在数学.物理和化学方面拥有着天才般的杰出贡献,一生之中在现代计算机.博弈论.核武器和生化武器等许多领域内都 ...

  8. 目前计算机的发展处于第五代,计算机应用基础.pptx

    文档介绍: 第1章计算机系统基础 1945年冯提出了正确的关于计算机组成与工作方式的建议,主要思想为: (1)用二进制代码表示数据和指令:主要原因是电路实现简单.可靠性高.逻辑运算简单; (2)采用存 ...

  9. 1.1 夏驰和徐策带你了解计算机的发展方向

    1. 电子计算机的分类 电子计算机从总体上来说分为模拟计算机和数字计算机两大类. 电子模拟计算机 "模拟"就是相似的意思.模拟计算机的特点是数值由连续量来表示,运算过程也是连续的. ...

最新文章

  1. C++中const的用法
  2. Linux基础入门 | 目录结构
  3. 60分钟精通正则表达式
  4. TF之LSTM:基于Tensorflow框架采用PTB数据集建立LSTM网络的自然语言建模
  5. latex插入表格_如何将word表格变成LaTeX代码?
  6. C++static关键字
  7. the vmware authorization service is not running
  8. 常用技巧 —— 位运算 —— 位运算的应用
  9. 著名程序员刘涛涛WinMount程序BUG
  10. iOS百度地图的相关开发(一)
  11. Oracle修改字段类型方法总结
  12. 怎么修改windows8的主题桌面
  13. 贪心算法--经典问题(java实现)
  14. 现阶段的主流数据库分别是哪几种?
  15. 合天网安的渗透测试考核过程
  16. 计算机在线考试word,大学计算机考试word试题及答案.docx
  17. Python与GIS
  18. 同时打开对比两个pdf文件软件推荐
  19. windows update独立安装程序一直在此计算机上搜索更新
  20. 世界杯开幕战-德国战车VS哥队

热门文章

  1. OSChina 周二乱弹 —— 妈妈 我见着神仙了……
  2. 浙江大学计算机科学博士生导师名单,浙江大学计算机科学技术学院博士研究生导师简介:孙建伶...
  3. python基于广度优先(BFS)的迪杰斯特拉(Dijkstra)算法 求最短路径
  4. 输出图案-平行四边形
  5. Windows 上帝模式「完全控制面板」的介绍和使用
  6. 计算机科学与技术高中选课,高中选课哪些组合最好
  7. JavaScript Web 框架的“新浪潮”
  8. 『运筹OR帷幄』CSDN官方账号正式上线啦| 运筹学/优化理论/人工智能/数据科学的学习交流社区
  9. 为什么戏说php,戏说PHP——1.1切的开始
  10. c 语言形式参数,高级语言C的形式参数.doc