4

2

为什么间接寻址相对直接寻址可扩大寻址范围

假设:

计算机的 指令字长16位,其中 地址字段占8位(直接寻址时)。

存储器的 地址总线宽度为16位(即最大寻址范围是64KB)。

内存单元存储的数据宽度也是 16位(即每个单元能存一个地址)。

  1. 直接寻址的局限性
    若采用直接寻址,地址字段仅8位,可直接寻址的范围是 2⁸ = 256个单元(如0x00~0xFF)。

这远小于存储器实际的64KB(16位地址)范围,造成了浪费。

  1. 间接寻址的解决方式
    间接寻址的地址字段(8位)不直接表示操作数地址,而是指向一个内存单元,该单元中存储了 完整的16位操作数地址。

例如:

指令中的地址字段为 0x40(8位)。

CPU先访问内存单元 0x40,读取其中存储的 16位地址(如 0xA010)。

最终操作数位于 0xA010(16位地址,突破了8位限制)。

3

x86架构与ARM架构

特性 x86 ARM
指令集 CISC(复杂指令) RISC(精简指令)
功耗 较高(性能优先) 较低(能效优先)
主导领域 PC、服务器、高性能计算 移动设备、嵌入式、IoT
生态 Windows/Linux主流 Android/iOS主导

cmp v.s. test

CMP vs TEST 核心区别
指令 底层操作 主要用途 影响的关键标志位
CMP OP1 - OP2 比较数值大小 ZF, CF, SF, OF
TEST OP1 & OP2 检查位模式或判断零值 ZF, SF

  1. cmp

关键标志位:

ZF=1:两数相等(OP1 == OP2)。

CF=1:无符号数 OP1 < OP2。

SF≠OF:有符号数 OP1 < OP2。

  1. test

ZF=1:结果为零(所有位按位与后为0)。

SF=1:结果的最高位为1(负数)。

概述:

计算机系统导论

层次结构

硬件层次

冯诺依曼思想

五大组成硬件

软件层次

分为系统软件与应用软件

三个级别的语言、各种翻译程序的概念、翻译的四个阶段

计算机系统层次结构

性能指标

数据表示与运算

不同进制数之间的转换

原码、反码、补码、移码之间的表示与转换

运算方法与运算电路

带标志加法器、算数逻辑单元、加减运算电路、乘法运算电路、除法运算电路

定点数的移位、加减、乘除运算

浮点数的表示与运算

计算机系统的层次结构

层级 名称 关键功能 记忆口诀
M4 高级语言层 程序员编写的代码(如 C、Python),需编译成下层语言。 写代码
M3 汇编语言层 将高级语言编译为汇编指令(如 MOV AX, 5),再翻译为机器码。 翻译成汇编
M2 操作系统层 用机器语言实现操作系统功能(如进程调度、内存管理)。 OS 干活
M1 传统机器语言层 CPU 直接执行的二进制指令(如 10110000),是软硬件分界线。 硬件能懂
M0 微程序机器层 用微指令(更低级的控制信号)解释机器指令,由硬件直接执行。 硬件细节

汇编语言与机器语言在ARM与x86上的表现

操作 x86 汇编指令 x86 机器指令(二进制) ARM 汇编指令 ARM 机器指令(二进制)
将 5 存入寄存器 MOV AL, 5 10110000 00000101 MOV R0, #5 1110001110100000 00000101
加法(寄存器+1) ADD AX, 1 00000100 00000001 ADD R0, R0, #1 1110000010000000 00000001

关键点

  • x86:变长指令(1~15 字节),复杂寻址模式,兼容性强。
  • ARM:定长指令(4 字节),精简指令集(RISC),能效高。
  • 同一操作在不同架构下的机器码和汇编指令完全不同,这是系统结构的影响

数据通路宽度

指CPU内部一次能处理的二进制位数,即ALU(算术逻辑单元)和寄存器之间的数据传输位数。ALU位数通常等于机器字长

机器字长一般与CPU中通用寄存器的位数有关

通用寄存器:CPU中用于暂存数据和地址的存储单元,其位数通常等于机器字长。

  • 示例:
    32位CPU的通用寄存器(如EAX)是32位。
    64位CPU的通用寄存器(如RAX)是64位。

对用户透明/不透明的寄存器(无需/需要程序员直接操作)

  1. 对用户透明的寄存器
  • 指令寄存器(IR)

存储当前正在解码的指令,完全由硬件控制。

  1. 对用户不透明的寄存器
  • 通用寄存器(如x86的EAX、ARM的R0-R12)

存储运算数据或地址,程序员需显式使用(如MOV EAX, 5)。

  • 状态寄存器(FLAGS / CPSR)

包含条件码(零标志、进位标志等),程序员需通过分支指令(如JZ)或显式读写(如PUSHF)来使用。

  1. 特殊情况

**程序计数器(PC)**的透明性:分场景讨论

  • 大多数情况下透明(由硬件自动管理)

普通顺序执行:CPU自动递增PC,程序员无需干预。

  • 特定情况下不透明(程序员需显式操作)

汇编编程:直接通过指令修改PC(如x86的JMP、ARM的BX)。

周期的差异与比较

周期类型 定义 组成关系 典型场景 示例
时钟周期 CPU时钟信号的一个完整振荡周期(CPU频率倒数) 最小单位时间 所有硬件同步操作的基础 2GHz CPU → 时钟周期=0.5ns
CPU周期 完成一个基本操作的时间(如取指、执行) 1个CPU周期 = 多个时钟周期 非流水线CPU的指令分阶段执行 取指周期=4时钟周期,执行周期=3时钟周期
指令周期 执行一条完整指令所需的时间 1个指令周期 = 取指+解码+执行+访存+写回 衡量CPU处理单条指令的速度 简单指令CPI=1,复杂指令CPI>1
中断周期 处理硬件/软件中断请求的完整流程时间 中断周期 = 保存现场+执行中断服务程序+恢复现场 外设请求、异常处理 键盘输入触发中断,耗时约10-100时钟周期
机器周期 CPU执行一条指令所需的基本时间单位,通常由多个时钟周期(Clock Cycles)组成 一个机器周期包含以下阶段:取指、译码、执行、访存、写回

计算机中,CPU 的 CPI 与下列(A)因素无关。

A. 时钟频率B. 系统结构C. 指令集D. 计算机组织

RISC(精简指令集)通常 CPI 较低(接近 1)。CISC(复杂指令集)某些指令可能需要多个周期(CPI > 1)。
CPI 取决于 CPU 的架构、指令集和微架构优化,但与时钟频率无关。时钟频率影响的是 指令的执行速度(时间),而不是 每条指令所需的周期数(CPI)。

0的表示

1. 原码(Sign-Magnitude)

  • +000000000(最高位 0 表示正,其余位为数值 0
  • -010000000(最高位 1 表示负,其余位为数值 0
  • 特点:原码有 +0 和 -0 两种表示

2. 反码(Ones’ Complement)

  • +000000000(与原码相同)
  • -011111111(负数的反码是对其绝对值的原码逐位取反)
  • 特点:反码也有 +0 和 -0 两种表示

3. 补码(Two’s Complement)

  • +000000000(与原码相同)
  • -0:补码规定 0 只有一种表示,即 00000000,而 10000000 表示 -128(8位补码的最小值)。
  • 特点:补码 没有 -0,使得表示范围比原码和反码多一个数(-128)。

4. 移码(Excess-K,通常用于浮点数阶码)

  • 移码 = 真值 + 偏移量(通常 ( K = 2^{n-1} ) 或 ( 2^{n-1}-1 ))
  • 偏移量 ( K = 128 )(8位移码)为例:
    • +00 + 128 = 12810000000
    • -0-0 + 128 = 12810000000
  • 特点:移码 没有 +0 和 -0 的区别,统一表示为 10000000
  • 王道计组2-1-5-24

“当且仅当” 的含义

A ⇔ B(A 和 B 完全等价)

在逻辑和数学中,“当且仅当”(if and only if,缩写为 iff)表示 两个命题在逻辑上完全等价,即:

  • 如果 A 成立,那么 B 一定成立(A ⇒ B)
  • 如果 B 成立,那么 A 也一定成立(B ⇒ A)

CF中的Cout

  1. 加法时:最高位产生进位:Cout = 1
  2. 减法时:最高位不够减,借一:Cout=0
  3. Cout异或Sub = CF
  4. CF只对无符号数有意义
  • 关于2的理解:计算 000 - 111(3位无符号数)
    计算过程(用补码实现减法):
    减法 A - B 可通过 A + (−B) 完成,其中 −B 用 二进制补码 表示:求 B(111)的补码(即 -B):按位取反:111 → 000
    加 1:000 + 1 = 001(-7 的补码)。计算 000 + 001 = 001(直接相加,无进位,则Cout=0)。

关键点:补码减法的 Cout 需要额外判断。

乘法运算电路中的控制逻辑

404
404

注:第三步为判断Y[0]=0.

运算器的组成

王道P206