计算机系统基础

一
一些c的例子









这两个指令区别在于,右边的指令先将a视为一个int类型的数据再强制转换为double,左边的是直接将其视为double类型的数据
冯·诺依曼计算机
冯·诺依曼的故事省略
下图是冯诺依曼机器工作方式的大致描述

流程图如下

IAS是普林斯顿大学的简称,这台计算机是在该学校制成的
要有一个算数逻辑元件(算数运算+逻辑运算):运算器
有一个解释指令的元件(译码):控制器
有一个主存储器
有一个io设备
要求五大部件(io算两个)
抽象出来的流程图如下

下图是冯诺依曼结构的主要思想

数据和指令都是01序列,但是计算机能够区分他们
相较于二战期间产生的计算机(用十进制存储),冯诺依曼结构采用二进制的存储
现代计算机结构
下图是现代计算器机构的示意图

ALU:算数逻辑运算部件
输入到ALU中的操作数可以是主存储器中的操作数也可以是寄存器中的操作数
计算结果也可以存储在寄存器中,也可以通过总线存储在主存储器上
MDR(Memory Data Register) : 存储器数据寄存器,用于cpu与主存之间的数据传输
ALU计算出的结果也可以是标志信息:如计算结果的符号,有没有进位,有没有溢出
这些标志性信息可以送到控制器影响后续的指令执行
每条指令要运行到他是会将他的地址运输到一个叫pc(Program Counter程序计数器)的寄存器
注意指令地址存pc//gpt说通常不会将pc中的指令地址存到mar,pc一般由cpu内部控制逻辑直接控制
操作数的地址要送到mar//gpt说从指令获取操作数地址存到mar,实现cpu和主存的通信(取操作数)
GPRs(General-purpose Registers):通用寄存器组
计算结果可以存在gprs中
IR(Instruction Register):指令寄存器
cpu要执行一个指令时,先从内存中读出一个指令到mdr,再从mdr传到ir,ir中的操作码传到控制器进行译码
在现代计算机结构中mdr和mar与总线相连
cpu要从存储器取指令,需要:
mar将地址送到存储器,控制器向存储器发出读的控制信号
读出来的数据通过数据线送到mdr,指令的话就送到ir,数据的话就送到寄存器再送到ALU计算,或者直接送到ALU
CPU:中央处理器
计算机的工作原理

用妈妈做菜举例,将计算机看作一个厨房
op:操作码字段,指出指令的操作性质和操作类型
addp:操作地址,指出操作数在哪个地址单元,可以是寄存器也可以是存储器
下图是计算机的工作过程

指令需要给出操作码、操作数(一个或者两个)、若干操作数的地址(地址可能是寄存器编号,主存编号)

编程语言发展史
机器语言:采用打孔的方式代表0/1,不方便,在指令前加指令需要修改其他的指令(地址跳转用0/1序列表示,添加指令后后面的地址都会改变),每次添加指令就需要整篇代码修改。见下图

汇编语言:将一些操作数设置为助记符,这样即使添加语句也不会影响跳转指令,将一些指令做成助记符如:0101=add,0010=jc(条件判断语句),0110=sub(减法)),也用助记符表示寄存器。这样方便了人理解代码,但是机器不认识指令。

这需要将汇编指令转换为机器指令,所使用的转换程序,我们叫他汇编程序。
Ld :Load 装入
St :Store 存储
指令的功能


指令包括操作数和地址码
只能描述存取一个数,两个数进行运算之类的简单操作
机器码和汇编语言是机器级别的语言,仍是不方便编写程序
接着发展出了高级编程语言
与机器结构无关,一条语句可能对应多条指令
高级语言转换为机器级语言的两种方式:
- 编译程序(Complier):将高级语言源程序转换为机器级目标程序,执行时只启动目标程序(如果转换为了汇编语言,还要通过汇编程序转换为机器语言)
- 解释程序(Interpreter):将高级语言语句逐条翻译成机器指令并执行,不生成目标文件。
Hello程序从源代码到可执行文件

以Linux操作系统讲:程序的数据流动过程
键盘(input设备)输入./hello
./hello会被存储到存储器(先存到寄存器里再通过store指令存储到主存上)
当回车键入之后,shell会调用一些系统调用,将控制权给hello程序
系统调用会把hello的可执行文件装载到主存上(这就是我们说的存储程序的工作方式),程序的运行结果也会存储到主存上
接着会将结果传输到显示器上(先送到寄存器上,再从寄存器到显示器)
下图是流程

在usb,寄存器,主存,这些都是可以存储的部件,叫“缓存”技术

lw: load word
第一个字段是操作码字段,后面的字段是地址码

指令集是硬件和操作系统间的接口(抽象),
计算机结构的层次

操作系统可以看作一个软件,可以将高级语言转换为
