跳转至

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)

分析问题:

  1. 指令周期:一个指令周期是CPU执行一条指令所需的时间。它通常包括取指令、译码、执行等步骤。

  2. “为从内存读取指令操作码”:这明确指出了正在进行的是**取指令**阶段。

  3. “首先要将(2)的内容送到地址总线上”:这是一个关键步骤。在取指令阶段,CPU需要知道去内存的哪个地址拿指令。这个地址是哪个寄存器提供的?

  4. PC (程序计数器):PC 的作用是**存放下一条要执行的指令的地址**。在取指令阶段,CPU首先会从 PC 中取出这个地址,然后将其送到地址总线上,以便去内存中找到并取出指令。

  5. 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的表示也是唯一的。 移码保持了数据原有的大小顺序,可以直接用于比较大小。