1.1为什么要学习计算机基础
(1)
– 计算机好像不可靠
– 程序执行结果不仅依赖于高级语言语法和语义,还与其他好多方面有关
– 本来以为学学编程和计算机基本原理就能当程序员,没想到还挺复杂的,计算机专业不好学
– 感觉要把很多概念和知识联系起来才能理解程序的执行结果
一点不错!理解程序的执行结果要从系统层面考虑!从机器角度来说,它永远是对的!
学完“计算机系统基础”就会对计算机系统有清晰的认识,以后再学其他相关课程就容易多了。
你说对了!把许多概念和知识联系起来就是李国杰院士所提出的“系统思维”。 即:站在“计算机系统”的角度考虑问题!
(2)系统能力基于“系统思维”
系统思维
– 从计算机系统角度出发分析问题和解决问题
– 首先取决于对计算机系统有多了解,“知其然并知其所以然”
• 高级语言语句都要转换为机器指令才能在计算机上执行
• 机器指令是一串0/1序列,能被机器直接理解并执行
• 计算机系统是模运算系统,字长有限,高位被丢弃
• 运算器不知道参加运算的是带符号数还是无符号数
• 在计算机世界,x*x可能小于0,(x+y)+z不一定等于x+(y+z)
• 访问内存需几十到几百个时钟,而访问磁盘要几百万个时钟
• 进程具有独立的逻辑控制流和独立的地址空间
• 过程调用使用栈存放参数和局部变量等,递归过程有大量额外指令,增加时间开销,并可能发生栈溢出
•只有先理解系统,才能改革系统,并应用好系统!
(3)“计算机系统基础”内容提要
课程目标:使学生清楚理解计算机是如何生成和运行可执行文件的!
重点在高级语言以下各抽象层
– C语言程序设计层
• 数据的机器级表示、运算
• 语句和过程调用的机器级表示
– 操作系统、编译和链接的部分内容
– 指令集体系结构(ISA)和汇编层
• 指令系统、机器代码、汇编语言
– 微体系结构及硬件层
• CPU的通用结构
• 层次结构存储系统
(4)为什么要学习这门课程-收获?
– 为了编程序时少出错
– 为了在程序出错时很快找到出错的地方
– 为了明白程序是怎样在计算机上执行的
– 为了强化“系统思维”
– 为了更好地理解计算机系统,从而编写出更好的程序
– 为后续课程的学习打下良好基础
– 为了编写出更快的程序
– 为了更好地认识计算机系统
1.2计算机系统基本组成与基本功能
(1)现代计算机的原型
– 在那个报告中提出的计算机结构被称为冯·诺依曼结构。
– 冯·诺依曼结构最重要的思想是“存储程序(Stored-program)”
工作方式:
任何要计算机完成的工作都要先被编写成程序,然后将程序和原始数据送入主存并启动执行。一旦程序被启动,计算机应能在不需操
作人员干预下,自动完成逐条取出指令和执行指令的任务。
– 冯·诺依曼结构计算机也称为冯·诺依曼机器(Von NeumannMachine)。
– 几乎现代所有的通用计算机大都采用冯·诺依曼结构,因此,IAS计算机是现代计算机的原型机。
(2)冯·诺依曼结构的主要思想
1. 计算机应由运算器、控制器、存储器、输入设备和输出设备五个基本部件组成。
2. 各基本部件的功能是:
• 存储器不仅能存放数据,而且也能存放指令,形式上两者没有区别,但计算机应能区分数据还是指令;
• 控制器应能自动取出指令来执行;
• 运算器应能进行加/减/乘/除四种基本算术运算,并且也能进行一些逻辑运算和附加运算;
• 操作人员可以通过输入设备、输出设备和主机进行通信。
3. 内部以二进制表示指令和数据。每条指令由操作码和地址码两部分组成。操作码指出操作类型,地址码指出操作数的地址。由一串指令组成程序。
4. 采用“存储程序”工作方式。
(3)现代计算机结构模型
(4)计算机是如何工作的?
程序由指令组成(菜单由菜谱组成)
程序在执行前
数据和指令事先存放在存储器中,每条指令和每个数据都有地址,指令按序存放,指令由OP、ADDR字段组成,程序起始地址置PC
(原材料和菜谱都放在厨房外的架子上, 每个架子有编号。妈妈从第5个架上指定菜谱开始做)
开始执行程序
第一步:根据PC取指令(从5号架上取菜谱)
第二步:指令译码(看菜谱)
第三步:取操作数(从架上或盘中取原材料)
第四步:指令执行(洗、切、炒等具体操作)
第五步:回写结果(装盘或直接送桌)
第六步:修改PC的值(算出下一菜谱所在架子号6=5+1)
继续执行下一条指令(继续做下一道菜)
(5)指令和数据
• 程序启动前,指令和数据都存放在存储器中,形式上没有差别,都是0/1序列
• 采用”存储程序“工作方式:
– 程序由指令组成,程序被启动后,计算机能自动取出一条一条指令执行,在执行过程中无需人的干预。
• 指令执行过程中,指令和数据被从存储器取到CPU,存放在CPU内的寄存器中,指令在IR中,数据在GPR中。
指令中需给出的信息:
操作性质(操作码)
源操作数1 或/和 源操作数2 (立即数、寄存器编号、存储地址)
目的操作数地址 (寄存器编号、存储地址)
存储地址的描述与操作数的数据结构有关!
(6)什么是计算机?
–计算机是一种能对数字化信息进行自动、高速算术和逻辑运算的处理装置。
• 计算机的基本部件及功能:
–运算器(数据运算):ALU、GPRs、标志寄存器等
–存储器(数据存储):存储阵列、地址译码器、读写控制电路
–总线(数据传送):数据(MDR)、地址(MAR)和控制线
–控制器(控制):对指令译码生成控制信号
• 计算机实现的所有任务都是通过执行一条一条指令完成的
1.3程序开发和执行过程
(1)最早的程序开发过程
用机器语言编写程序,并记录在纸带或卡片上,0/1序列编写程序
(2)用汇编语言开发程序
汇编语言出现
– 用助记符表示操作码
– 用标号表示位置
– 用助记符表示寄存器
你认为用汇编语言编写的优点是:
不会因为增减指令而需要修改其他指令
不需记忆指令编码,编写方便
可读性比机器语言强
需将汇编语言转换为机器语言!--->用汇编程序转换
(3)进一步认识机器级语言
汇编语言(源)程序由汇编指令构成
• 你能用一句话描述什么是汇编指令吗?
– 用助记符和标号来表示的指令(与机器指令一一对应)
• 指令又是什么呢?
– 包含操作码和操作数或其地址码(机器指令用二进制表示,汇编指令用符号表示)
– 只能描述:取(或存一个数)
两个数加(或减、乘、除、与、或等)
根据运算结果判断是否转移执行
• 想象用汇编语言编写复杂程序是怎样的情形?
(例如,用汇编语言实现排序(sort)、矩阵相乘)
– 需要描述的细节太多了!程序会很长很长!而且在不同结构的机器上就不能运行!
机器语言和汇编语言都是面向机器结构的语言,故它们统称为机器级语言
结论:用汇编语言比机器语言好,但是,还是很麻烦!
指令所能描述的功能:load/store/add等对数据的操作
Ld M#,R# (将存储单元内容装入寄存器)
St R#,M# (将寄存器内容装入存储单元)
Add R#,M# (类似的还有Sub,Mul等;操作数还可“R#,R#”等)
Jxx M# (若满足条件,则转移到另一处执行)
……
(4)用高级语言开发程序
随着技术的发展,出现了许多高级编程语言
– 它们与具体机器结构无关
– 面向算法描述,比机器级语言描述能力强得多
– 高级语言中一条语句对应几条、几十条甚至几百条指令
– 有“面向过程”和“面向对象”的语言之分
– 处理逻辑分为三种结构
• 顺序结构、选择结构、循环结构
– 有两种转换方式:“编译”和“解释”
• 编译程序(Complier):将高级语言源程序转换为机器级目标程序,执行时只要启动目标程序即可
• 解释程序(Interpreter ):将高级语言语句逐条翻译成机器指令并立即执行,不生成目标文件。
(5)一个典型程序的转换处理过程
预处理后的源程序(预处理cpp):hello.i
gcc -E hello.c -o hello.i
汇编语言程序(编译cc1):hello.s
gcc -S hello.i -o hello.s
gcc -S hello.c
可重定位目标程序(汇编as):hello.o (二进制)
gcc -c hello.c
可执行目标程序(链接ld):hello(二进制)
gcc hello.c -o hello
(6)Hello程序的数据流动过程
(7)不同层次语言之间的等价转换
(8)开发和运行程序需什么支撑?