1.1 计算机基础知识
计算机系统是由硬件和软件组成的,它们协同工作来运行程序。计算机的基本硬件系统由运算器、控制器、存储器、输入设备和输出设备5大部件组成。
CPU¶
运算器、控制器等部件被集成在一起统称为中央处理单元(CentralProcessingUnit,CPU)。
- CPU的控制器:程序控制、操作控制、时间控制
- CPU的运算器:数据处理
运算器¶
功能:
- 执行所有的算术运算
- 执行所有的逻辑运算并进行逻辑测试
组成部件:
- 算术逻辑单元ALU
- 累加寄存器AC
- 数据缓冲器DR 作为CPU和内存、外部设备之间数据传送的中转站;作为CPU和内存、外围设备之间在操作速度上的缓冲;在单累加器结构的运算器中,数据缓冲寄存器还可兼作为操作数寄存器。
- 状态条件寄存器PSW
控制器¶
它不仅要保证程序的正确执行,而且要能够处理异常事件。
组成部件:
- 指令寄存器(I**nstruction **R**egister):临时存放当前正在执行的指令。 ->就像厨师的**工作台,把当前要做的这道菜的配方(指令)摆在这里。
- 程序计数器(P**rogram **C**ounter):存放**下一条**将要执行的指令的内存地址。它也被称为“指令计数器”。 ->就像厨师手中的**书签,它告诉厨师下一道菜(下一条指令)在哪里。
- 地址寄存器(A**ddress **R**egister):保存CPU当前正要访问的内存单元的地址。 ->就像厨师的**购物清单,记录着这道菜所需要的食材(数据)在储藏室(内存)里的具体位置。
- 指令译码器(I**nstruction **D**ecoder):分析和解释指令。 ->就像厨师的**翻译官,把工作台上的神秘配方(指令代码)翻译成具体的动作(操作信号)。
指令
操作码(做什么操作,如加法、移动数据)+地址码(操作数在哪里,“2”/“3”):2+3
译码
类型 | 译码对象 | 负责部件 | 核心作用 | 举例 |
---|---|---|---|---|
指令译码 | 指令 | 指令译码器 | 决定“做什么” | 识别出“加法”指令,并产生加法操作的控制信号 |
地址译码 | 地址 | 内存地址译码电路 | 决定“从哪里取/存” | 将地址 0xABCD 定位到内存芯片上的特定位置 |
数据译码 | 数据 | 执行单元 (ALU) | 决定“如何处理”或“如何解释” | 将 00000010 解释为整数 2 |
计算机在一个指令周期的过程中,为从内存读取指令操作码,首先要将 ____ 的内容送到地址总线上。
A. 指令寄存器(IR) B. 通用寄存器(GR) C. 程序计数器(PC) D. 状态寄存器(PSW)
分析问题:
-
指令周期:一个指令周期是CPU执行一条指令所需的时间。它通常包括取指令、译码、执行等步骤。
-
“为从内存读取指令操作码”:这明确指出了正在进行的是**取指令**阶段。
-
“首先要将(2)的内容送到地址总线上”:这是一个关键步骤。在取指令阶段,CPU需要知道去内存的哪个地址拿指令。这个地址是哪个寄存器提供的?
-
PC (程序计数器):PC 的作用是**存放下一条要执行的指令的地址**。在取指令阶段,CPU首先会从 PC 中取出这个地址,然后将其送到地址总线上,以便去内存中找到并取出指令。
-
IR (指令寄存器):IR 的作用是**存放当前正在执行的指令**。在取指令阶段之后,从内存取出的指令会被存入 IR。因此,在“取指令”这个阶段,IR 里面还没有指令,它的内容不是地址。IR 的内容是指令本身,而不是指令的地址。
结论:
根据指令周期的基本流程,在**取指令**阶段,CPU首先需要知道指令的地址。而这个地址就是由**程序计数器(PC)** 提供的。因此,PC 的内容首先被送到地址总线上。
指令寄存器(IR) 是用来**存放**从内存中取出的**指令**,而不是存放指令的地址。这个过程发生在地址总线传输地址**之后**。
所以,正确的答案是 C,因为在指令周期的取指令阶段,PC 里的地址是第一个被送上地址总线的。
数值表示¶
原码、反码、补码与移码¶
1. 原码表示法 (Sign-Magnitude)¶
原码是最直观的表示方法,直接将数值的符号和绝对值转换为二进制。
-
定义:
- 整数: 符号位(0为正,1为负)+ 数值的绝对值的二进制表示。
- 小数: 符号位(0为正,1为负)+ 数值的绝对值的二进制表示。
-
公式定义 (设机器字长为n):
- 若X是纯整数: $$ [X]_{原} = \begin{cases} X & 0 \le X < 2^{n-1} \ 2^{n-1} + |X| & -(2^{n-1}-1) \le X \le 0 \end{cases} $$
- 若X是纯小数: $$ [X]_{原} = \begin{cases} X & 0 \le X < 1 \ 1 + |X| & -1 < X \le 0 \end{cases} $$ 注意:在原码表示中,+0 和 -0 有不同的编码。
2. 反码表示法 (One's Complement)¶
反码的出现是为了解决减法运算的问题,它可以将减法转换为加法。
-
定义:
- 正数: 正数的反码与其原码相同。
- 负数: 负数的反码是在其原码的基础上,符号位保持不变,其余数值位按位取反。
-
公式定义 (设机器字长为n):
- 若X是纯整数: $$ [X]_{反} = \begin{cases} X & 0 \le X < 2^{n-1} \ (2^n - 1) + X & -(2^{n-1}-1) \le X \le 0 \end{cases} $$
- 若X是纯小数: $$ [X]_{反} = \begin{cases} X & 0 \le X < 1 \ (2 - 2^{-(n-1)}) + X & -1 < X \le 0 \end{cases} $$ 注意:在反码表示中,+0 和 -0 同样有两种不同的编码。
3. 补码表示法 (Two's Complement)¶
补码是目前计算机系统中最常用的有符号数表示方法,它解决了反码中“0”的表示不唯一的问题,并能简化运算。
-
定义:
- 正数: 正数的补码与其原码相同。
- 负数: 负数的补码是在其反码的末位加1。
-
公式定义 (设机器字长为n):
- 若X是纯整数: $$ [X]_{补} = \begin{cases} X & 0 \le X < 2^{n-1} \ 2^n + X & -2^{n-1} \le X < 0 \end{cases} \pmod{2^n} $$
- 若X是纯小数: $$ [X]_{补} = \begin{cases} X & 0 \le X < 1 \ 2 + X & -1 \le X < 0 \end{cases} \pmod{2} $$ 注意:在补码表示中,0只有一种编码,并且比原码和反码能多表示一个最小的负数。
4. 移码表示法 (Excess/Biased Representation)¶
移码主要用于表示浮点数中的阶码,其特点是能方便地比较大小。
-
定义: 移码是在真值 X 的基础上增加一个固定的偏移量(或称为偏置值)。 对于n位的整数,偏移量通常是 2n-1。 移码的计算方法也可以是将补码的符号位取反得到。
-
公式定义 (设机器字长为n,偏移量为 2n-1):
- 若X是纯整数: $$ [X]_{移} = 2^{n-1} + X \quad (-2^{n-1} \le X < 2^{n-1}) $$
- 若X是纯小数: $$ [X]_{移} = 1 + X \quad (-1 \le X < 1) $$ 注意:移码中,0的表示也是唯一的。 移码保持了数据原有的大小顺序,可以直接用于比较大小。