这里写目录标题
用系统思维分析问题
例子1
-
ISO C90标准下, 在32位系统上
-
以下C表达式的结果是什么
- 2147483648 < 2147483648 -
执行结果为 : false
-
以下关系表达式的结果为 : True
int i = -2147483648;
i < 2147483648
为什么 ?, 编译器如何处理字面量 ?
例子2
sum(int a[], unsigned len)
{
int i, sum = 0;
for (i = 0; i <= len-1; i++)
sum += a[i]
return sum;
}
-
这段代码的意思是 :
- 一个数组, 有len个元素, 把所有元素进行累加, 作为返回值.
-
当参数len为0时, 在机器上执行时, 会报错访存异常.
-
当len为int型时, 则返回0
为什么 ?, 高级语言中的运算规则是什么 ?
例子3
- 若x和y为int型, 当
x = 65535
时,y = x * x;
y 的值为多少? y = -131071
.
为什么 ?
例子4
main.c
int d = 100;
int x = 200;
int main()
{
p1();
printf("d=%d, x=%d\n", d,x);
return 0;
}
p1.c
double d;
void p1()
{
d=1.0;
}
- d = 0, x = 1072693248
为什么 ?
例子5
#include <stdio.h>
main()
{
double a = 10;
printf("a = %d\n", a);
}
- 在IA-32上运行时, 打印结果为0
- 在x86-64上运行时, 打印出来的a是一个不确定值
为什么 ?
- 浮点数在机器中是如何表示的
- 浮点指令是什么样子的
- 浮点数的体系结构是什么
- 过程调用的参数传递
冯 · 诺依曼结构计算机采用存储程序工作方式
- 任何要计算机完成的工作都要先被编写成程序, 然后将程序和原始数据送入主存并启动执行.
冯 · 诺依曼结构是怎样的
- 应该有个主存, 用来存放程序和数据
- 应该有一个自动逐条取出指令的部件
- 应该有具体执行指令的部件
- 程序由指令构成
- 指令描述如何对数据进行处理
- 应该有将程序和原始数据输入计算机的部件
- 应该有将运算结果输出计算机的部件
冯 · 诺依曼结构的主要思想
-
计算机应由运算器, 控制器, 存储器, 输入设备和输出设备五个基本部件组成
-
各基本部件的功能是 :
- 存储器 : 存储数据和指令, 计算机应能区分数据还是指令
- 控制器 : 自动取出指令来执行.
- 运算器 : 能进行加减乘除四种基本算术运算, 并且也能进行一些逻辑运算和附加运算.
- 操作人员可以通过输入设备, 输出设备和主机进行通信
-
内部以二进制表示指令和数据.
- 每条指令有操作码和地址码两部分组成.
- 操作码指出操作类型
- 地址码指出操作数的地址.
- 每条指令有操作码和地址码两部分组成.
现代计算机结构模型
-
CPU : 中央处理器
-
PC : 程序计数器
-
MAR : 存储器地址寄存器
-
ALU : 算术逻辑部件
-
IR : 指令寄存器
-
MDR : 存储器数据寄存器
-
GPRs : 通用寄存器组
-
存储器 : 存储器划分为一个一个的存储单元, 每个存储单元有各自的编号
-
ALU : 算术逻辑部件, 相当于冯诺依曼中的控制器.
- 送到ALU里面的数据可以是寄存器里的数据, 也可以是存储器里面的数据.
- 计算出来的结果可以继续放到某个寄存器里面. 也可以通过总线放到存储器里面
-
MDR : 寄存器里面的数据可以通过MDR送到存储器, 存储器里面的数据也可以通过MDR送到寄存器
-
运算的结果除了直接产生的数据以外, 还有一些标志信息 (比如运算结果得到的符号, 有没有进位, 有没有溢出)
- 这些标志信息可以送到控制器里面, 影响后续指令的执行.
-
PC : 如果执行到这条指令, 这条指令的地址是送到一个专门的寄存器PC里面.
-
MAR : 指令的地址要先送到地址寄存器MAR里面. 然后通过总线送到存储器
- 操作数的地址也要通过MAR送到存储器.
-
IR : 指令取过来送到控制器执行的时候, 先要放到一个指令寄存器IR里面
- 指令寄存器里面的操作码字段会送到控制器去进行译码
CPU和存储器是通过总线相连的
计算机是如何工作的
使用现实生活中的做饭举例说明
-
厨房 - CPU
-
做饭的人 - 控制器
-
盘 - GRPs
-
锅灶等 - ALU
-
架子 - 存储器 , 原料都放在这里
-
做菜前
- 原材料 (数据) 和菜谱 (指令) 都按序放在厨房外的架子 (存储器), 每个架子有编号 (存储单元地址).
- 菜谱 : 原料位置, 做法, 做好的菜放在哪里等.
- 例如, 把10, 11号架上的原料一起炒, 并装入3号盘
- 这相当于一条指令, 把10号单元和11号单元的数据相加, 加起来后放到某个寄存器里面
- 告诉做菜的人从第5个架上(起始PC=5)指定菜谱开始做
- 相当于告诉CPU从主存单元里面取指令执行指令.
-
开始做菜
- 第一步 : 从5号架上取菜谱 (根据PC取指令)
- 第二步 : 看菜谱 (指令译码)
- 第三步 : 从架上或盘中取原材料 (取操作数)
- 第四步 : 洗, 切, 炒等具体操作 (指令执行)
- 第五步 : 装盘 (回写结果)
- 第六步 : 算出下一菜谱所在架子号6 = 5 + 1 (修改PC的值)
程序由指令组成
- 程序在执行前
- 数据和指令事先存放在存储器中, 每条指令和每个数据都有地址, 指令按序存放, 指令有OP, ADDR字段组成, 程序起始地址置PC
- OP : 操作码字段