|
| 1 | +# 计算机组成原理 |
| 2 | + |
| 3 | +!!! abstract "课程概述" |
| 4 | + 本笔记涵盖计算机组成原理的核心内容,包括计算机系统结构、指令执行过程、性能评估等重要概念。 |
| 5 | + |
| 6 | +## 1. 计算机系统概述 |
| 7 | + |
| 8 | +### 1.1 计算机发展历程 |
| 9 | + |
| 10 | +!!! timeline "计算机发展的四个阶段" |
| 11 | + |
| 12 | + | 年份 | 技术特征 | 代表机型 | |
| 13 | + |--------|------------------------|----------| |
| 14 | + | 1946 | 电子管时代 | ENIAC | |
| 15 | + | 1958 | 晶体管、磁芯存储器 | IBM 7090 | |
| 16 | + | 1965 | 中小规模集成电路 | IBM 360 | |
| 17 | + | 1972 | 超大规模集成电路 | Intel 4004 | |
| 18 | + |
| 19 | +!!! info "摩尔定律" |
| 20 | + **核心观点:** 每18个月,CPU性能翻倍 |
| 21 | + |
| 22 | + **发展趋势:** 半导体存储器容量从1KB增长到1GB,体现了集成电路技术的飞速发展 |
| 23 | + |
| 24 | +#### 微处理器发展历程 |
| 25 | + |
| 26 | +!!! example "Intel微处理器演进" |
| 27 | + |
| 28 | + | 年份 | 型号 | 位数 | 特点 | |
| 29 | + |-----------|-------------------|--------|------| |
| 30 | + | 1971 | Intel 4004 | 4位 | 首款微处理器 | |
| 31 | + | 1974 | Intel 8080 | 8位 | 个人计算机起步 | |
| 32 | + | 1978 | Intel 8086 | 16位 | x86架构诞生 | |
| 33 | + | 1985 | Intel 80386 | 32位 | 保护模式 | |
| 34 | + | 1993 | Pentium | 64位 | 超标量架构 | |
| 35 | + | 2000年代 | Core系列 | 64位 | 多核时代 | |
| 36 | + |
| 37 | +### 1.2 计算机系统结构 |
| 38 | + |
| 39 | +!!! abstract "冯·诺依曼结构" |
| 40 | + 计算机由**五大部分**组成: |
| 41 | + |
| 42 | + - **运算器(ALU)**:执行算术和逻辑运算 |
| 43 | + - **控制器(CU)**:控制程序执行流程 |
| 44 | + - **存储器(Memory)**:存储程序和数据 |
| 45 | + - **输入设备**:数据输入 |
| 46 | + - **输出设备**:结果输出 |
| 47 | + |
| 48 | +#### 重要寄存器 |
| 49 | + |
| 50 | +!!! note "存储器相关寄存器" |
| 51 | + - **MAR**(Memory Address Register):存储器地址寄存器 |
| 52 | + - **MDR**(Memory Data Register):存储器数据寄存器 |
| 53 | + |
| 54 | +!!! note "运算器相关寄存器" |
| 55 | + - **ACC**(Accumulator):累加器 |
| 56 | + - **MQ**(Multiplier-Quotient):乘商寄存器 |
| 57 | + - **X**:操作数寄存器 |
| 58 | + - **IX**(Index Register):变址寄存器 |
| 59 | + - **BR**(Base Register):基址寄存器 |
| 60 | + |
| 61 | +!!! note "控制器相关寄存器" |
| 62 | + - **PSW**(Program Status Word):程序状态字寄存器 |
| 63 | + - **PC**(Program Counter):程序计数器 |
| 64 | + - **IR**(Instruction Register):指令寄存器 |
| 65 | + |
| 66 | +#### 程序编译执行过程 |
| 67 | + |
| 68 | +!!! example "从源码到可执行文件" |
| 69 | + ``` |
| 70 | + hello.c → hello.i → hello.s → hello.o → hello.exe |
| 71 | + 源文件 预处理 汇编代码 目标文件 可执行文件 |
| 72 | + ``` |
| 73 | + |
| 74 | +#### 指令执行过程 |
| 75 | + |
| 76 | +!!! important "指令执行的基本步骤" |
| 77 | + |
| 78 | + **1. 取指阶段:** |
| 79 | + ``` |
| 80 | + PC → MAR → Memory → MDR → IR |
| 81 | + ``` |
| 82 | + |
| 83 | + **2. 分析阶段:** |
| 84 | + ``` |
| 85 | + OP(IR) → CU(控制单元分析操作码) |
| 86 | + ``` |
| 87 | + |
| 88 | + **3. 执行阶段:** |
| 89 | + ``` |
| 90 | + Address(IR) → MAR → Memory → MDR → ACC |
| 91 | + ``` |
| 92 | + |
| 93 | +### 1.3 计算机性能指标 |
| 94 | + |
| 95 | +#### 基本概念 |
| 96 | + |
| 97 | +!!! info "硬件性能参数" |
| 98 | + - **机器字长**:CPU一次能处理的二进制位数 |
| 99 | + - **数据通路带宽**:数据总线的位数 |
| 100 | + - **主存容量**:$2^{MAR} \times MDR$(地址空间×字长) |
| 101 | + |
| 102 | +#### 运算速度指标 |
| 103 | + |
| 104 | +!!! tip "性能评估指标" |
| 105 | + |
| 106 | + **基本概念:** |
| 107 | + - **吞吐量**:单位时间内处理的任务数量 |
| 108 | + - **响应时间**:从请求到完成的时间 |
| 109 | + - **主频**:CPU时钟频率 |
| 110 | + - **CPU时钟周期**:主频的倒数 |
| 111 | + |
| 112 | +!!! example "重要性能公式" |
| 113 | + |
| 114 | + **CPI(每指令周期数):** |
| 115 | + $$CPI = \frac{CPU时钟周期数}{指令数}$$ |
| 116 | + |
| 117 | + **IPS(每秒指令数):** |
| 118 | + $$IPS = \frac{主频}{CPI}$$ |
| 119 | + |
| 120 | + **CPU执行时间:** |
| 121 | + $$CPU执行时间 = \frac{CPU时钟周期数}{主频} = \frac{指令条数 \times CPI}{主频}$$ |
| 122 | + |
| 123 | + **MIPS(每秒百万指令):** |
| 124 | + $$MIPS = \frac{指令条数}{执行时间 \times 10^6} = \frac{主频}{CPI \times 10^6}$$ |
| 125 | + |
| 126 | + **FLOPS(每秒浮点运算数):** |
| 127 | + $$FLOPS = 每秒执行的浮点运算次数$$ |
| 128 | + |
| 129 | +!!! warning "性能指标使用注意" |
| 130 | + - CPI是衡量CPU效率的重要指标,越小越好 |
| 131 | + - MIPS不能完全反映计算机性能,因为不同指令复杂度不同 |
| 132 | + - FLOPS主要用于科学计算领域的性能评估 |
| 133 | + |
| 134 | +## 2. 数据表示和运算 |
| 135 | + |
| 136 | +### 2.1 数制与编码 |
| 137 | +#### 2.1.1 进制转换 |
| 138 | + |
| 139 | +!!! tip "十进制转二进制方法" |
| 140 | + |
| 141 | + **整数部分转换:** |
| 142 | + - 方法:不断除以2,取余数 |
| 143 | + - 顺序:余数倒序排列(先余为低位,后余为高位) |
| 144 | + |
| 145 | + **小数部分转换:** |
| 146 | + - 方法:不断乘以2,取整数部分 |
| 147 | + - 顺序:整数部分顺序排列(先整为高位,后整为低位) |
| 148 | + |
| 149 | +!!! example "进制转换示例" |
| 150 | + |
| 151 | + **整数转换:** 13₁₀ → ?₂ |
| 152 | + ``` |
| 153 | + 13 ÷ 2 = 6 ... 1 |
| 154 | + 6 ÷ 2 = 3 ... 0 |
| 155 | + 3 ÷ 2 = 1 ... 1 |
| 156 | + 1 ÷ 2 = 0 ... 1 |
| 157 | + ``` |
| 158 | + 结果:1101₂ |
| 159 | + |
| 160 | + **小数转换:** 0.375₁₀ → ?₂ |
| 161 | + ``` |
| 162 | + 0.375 × 2 = 0.75 → 取整数部分 0 |
| 163 | + 0.75 × 2 = 1.5 → 取整数部分 1 |
| 164 | + 0.5 × 2 = 1.0 → 取整数部分 1 |
| 165 | + ``` |
| 166 | + 结果:0.011₂ |
| 167 | + |
| 168 | +#### 2.1.2 定点数表示 |
| 169 | + |
| 170 | +!!! abstract "定点数的两种形式" |
| 171 | + |
| 172 | + **定点整数:** 符号位 + 数值位,小数点固定在最低位之后 |
| 173 | + - 格式:`S.XXXXXXX`(实际小数点在末尾) |
| 174 | + - 示例:`00000101` 表示 +5,`10000101` 表示 -5 |
| 175 | + |
| 176 | + **定点小数:** 符号位 + 数值位,小数点固定在符号位之后 |
| 177 | + - 格式:`S.XXXXXXX`(小数点在符号位后) |
| 178 | + - 示例:`0.1010000` 表示 +0.625,`1.1010000` 表示 -0.625 |
| 179 | + |
| 180 | +#### 2.1.3 编码方式 |
| 181 | + |
| 182 | +!!! important "四种编码方式对比" |
| 183 | + |
| 184 | +| 编码方式 | 定义 | 求法 | 表示范围(n位) | 特点 | |
| 185 | +|----------|------|------|-----------------|------| |
| 186 | +| **原码** | 最高位为符号位,其余为绝对值 | 正数:直接转二进制<br>负数:符号位为1,数值位为绝对值 | $-(2^{n-1}-1)$ ~ $+(2^{n-1}-1)$ | 有±0,直观易懂 | |
| 187 | +| **反码** | 正数同原码,负数数值位按位取反 | 正数:同原码<br>负数:符号位不变,数值位取反 | 同原码 | 有±0,是补码的中间步骤 | |
| 188 | +| **补码** | 正数同原码,负数为反码+1 | 正数:同原码<br>负数:反码+1 | $-2^{n-1}$ ~ $+(2^{n-1}-1)$ | 0唯一,便于运算 | |
| 189 | +| **移码** | 真值加上偏移量$2^{n-1}$ | $[X]_{移} = X + 2^{n-1}$ | 同补码 | 便于大小比较,用于浮点数指数 | |
| 190 | + |
| 191 | +!!! example "8位编码示例(以±5为例)" |
| 192 | + |
| 193 | + | 编码方式 | +5 | -5 | |
| 194 | + |----------|----|----| |
| 195 | + | **原码** | `00000101` | `10000101` | |
| 196 | + | **反码** | `00000101` | `11111010` | |
| 197 | + | **补码** | `00000101` | `11111011` | |
| 198 | + | **移码** | `10000101` | `01111011` | |
| 199 | + |
| 200 | +!!! note "变形补码(模4补码)" |
| 201 | + - **特点:** 符号位占两位 |
| 202 | + - **编码:** 00表示正数,11表示负数 |
| 203 | + - **用途:** 某些特殊运算场合 |
| 204 | + |
| 205 | +* 补充:两个互为相反数的数的补码可以通过互相取反加一得到。 |
| 206 | +* 补充:注意带符号整数用补码表示这种表述。 |
| 207 | + |
| 208 | +### 2.1.4 编码方式的关系与特点 |
| 209 | + |
| 210 | +!!! tip "编码转换规律" |
| 211 | + |
| 212 | + **正数特点:** |
| 213 | + - 正数的原码、反码、补码完全相同 |
| 214 | + |
| 215 | + **负数转换:** |
| 216 | + 1. 原码 → 反码:符号位不变,数值位按位取反 |
| 217 | + 2. 反码 → 补码:反码的最低位加1 |
| 218 | + 3. 原码 → 补码:可直接通过反码中转 |
| 219 | + |
| 220 | + **补码优势:** |
| 221 | + - 解决了0的唯一性问题(只有+0,没有-0) |
| 222 | + - 加减运算统一,便于硬件实现 |
| 223 | + |
| 224 | + **移码特点:** |
| 225 | + - 编码值与真值单调对应,便于比较大小 |
| 226 | + - 主要用于浮点数的指数部分 |
| 227 | + |
| 228 | + |
| 229 | + |
| 230 | +### 2.1.5 C语言中的数值类型 |
| 231 | + |
| 232 | +!!! info "C语言整数类型" |
| 233 | + |
| 234 | + **无符号整数(unsigned int):** |
| 235 | + - 表示范围:$0$ ~ $2^n - 1$ |
| 236 | + - 特点:只能表示非负数,没有符号位 |
| 237 | + |
| 238 | + **有符号整数(int):** |
| 239 | + - 表示范围:$-2^{n-1}$ ~ $2^{n-1} - 1$ |
| 240 | + - 编码方式:采用补码表示 |
| 241 | + - 特点:最高位为符号位 |
| 242 | + |
| 243 | +!!! warning "类型转换注意事项" |
| 244 | + - **有符号与无符号转换:** 位模式不变,但解释方式改变 |
| 245 | + - **溢出处理:** 超出表示范围时会发生截断 |
| 246 | + - **位运算:** 逻辑右移补0,算术右移补符号位 |
| 247 | + |
| 248 | +### 2.2 运算方式和电路 |
| 249 | + |
| 250 | +!!! todo "待补充内容" |
| 251 | + 定点数运算、移位运算、ALU设计等相关内容 |
| 252 | + |
| 253 | +### 2.3 浮点数的表示与计算 |
| 254 | + |
| 255 | +#### 2.3.1 浮点数基本格式 |
| 256 | + |
| 257 | +!!! abstract "浮点数组成" |
| 258 | + 浮点数由**阶码**和**尾数**两部分组成: |
| 259 | + |
| 260 | + ``` |
| 261 | + |<-----阶码E----->|<-----尾数M----->| |
| 262 | + |E_f|E1E2...E(n-1)|M_f|M1M2...M(n-1)| |
| 263 | + ``` |
| 264 | + |
| 265 | +**浮点数表示公式:** |
| 266 | +$$N = r^E \times M$$ |
| 267 | + |
| 268 | +其中: |
| 269 | +- **N**:浮点数的真值 |
| 270 | +- **r**:基数(通常为2) |
| 271 | +- **E**:阶码,表示指数部分 |
| 272 | +- **M**:尾数,表示有效数字部分 |
| 273 | + |
| 274 | +#### 2.3.2 浮点数的特点 |
| 275 | + |
| 276 | +!!! warning "浮点数溢出问题" |
| 277 | + - **上溢出**:指数过大,超出表示范围 |
| 278 | + - **下溢出**:指数过小,接近于0 |
| 279 | + - **解决方案**:需要进行溢出检测和处理 |
| 280 | + |
| 281 | +!!! important "规格化要求" |
| 282 | + 为了提高精度和唯一性,浮点数需要规格化: |
| 283 | + - **规格化形式**:尾数的最高位为1 |
| 284 | + - **目的**:消除前导零,提高有效数字位数 |
| 285 | + |
| 286 | +!!! note "编码方式" |
| 287 | + - **阶码**:通常采用移码表示,便于比较大小 |
| 288 | + - **尾数**:采用补码表示,包含符号位 |
| 289 | + - **注意**:阶码和尾数要分别进行补码转换 |
| 290 | + |
| 291 | +#### 2.3.3 IEEE 754标准 |
| 292 | + |
| 293 | +!!! abstract "IEEE 754浮点数标准" |
| 294 | + 国际通用的浮点数表示标准,定义了单精度和双精度两种格式。 |
| 295 | + |
| 296 | +##### 单精度浮点数(32位) |
| 297 | + |
| 298 | +对应C语言中的`float`类型: |
| 299 | + |
| 300 | +``` |
| 301 | +|符号(1)|<-----阶码E(8)----->|<-----尾数M(23)----->| |
| 302 | +|S 31|30 bias 23 |22 frac 0| |
| 303 | +``` |
| 304 | + |
| 305 | +##### 双精度浮点数(64位) |
| 306 | + |
| 307 | +对应C语言中的`double`类型: |
| 308 | + |
| 309 | +``` |
| 310 | +|符号(1)|<-----阶码E(11)----->|<-----尾数M(52)----->| |
| 311 | +|S 63 |62 bias 52 |51 frac 0| |
| 312 | +``` |
| 313 | + |
| 314 | +#### 2.3.4 IEEE 754编码规则 |
| 315 | + |
| 316 | +!!! tip "编码方式说明" |
| 317 | + |
| 318 | + **阶码编码:** |
| 319 | + - 采用**移码**表示 |
| 320 | + - 偏移量:$2^{k-1}-1$(k为阶码位数) |
| 321 | + - 单精度偏移量:127 |
| 322 | + - 双精度偏移量:1023 |
| 323 | + |
| 324 | + **尾数编码:** |
| 325 | + - 采用**原码**表示(注意不是补码) |
| 326 | + - 隐含前导1:实际表示为 `1.M` |
| 327 | + - 只存储小数点后的部分 |
| 328 | + |
| 329 | +!!! warning "特殊值处理" |
| 330 | + IEEE 754标准中,阶码全0和全1有特殊用途: |
| 331 | + |
| 332 | + - **阶码全0**:表示非规格化数或零 |
| 333 | + - **阶码全1**:表示无穷大或NaN(非数值) |
| 334 | + |
| 335 | +!!! example "IEEE 754格式特点" |
| 336 | + |
| 337 | + **隐含位技术:** |
| 338 | + - 规格化数的尾数隐含前导1 |
| 339 | + - 实际尾数为 `1.fraction` |
| 340 | + - 只存储小数点后的23位(单精度)或52位(双精度) |
| 341 | + |
| 342 | + **为什么偏移量是 $2^{k-1}-1$:** |
| 343 | + - 避免阶码为128时导致的特殊情况 |
| 344 | + - 确保有足够的正负指数范围 |
| 345 | + |
| 346 | +#### 2.3.5 浮点数表示范围 |
| 347 | + |
| 348 | +!!! info "IEEE 754表示范围" |
| 349 | + |
| 350 | + **单精度浮点数(float):** |
| 351 | + - 有效数字:约7位十进制数字 |
| 352 | + - 指数范围:-126 ~ +127 |
| 353 | + - 数值范围:约 $1.4 \times 10^{-45}$ ~ $3.4 \times 10^{38}$ |
| 354 | + |
| 355 | + **双精度浮点数(double):** |
| 356 | + - 有效数字:约15-16位十进制数字 |
| 357 | + - 指数范围:-1022 ~ +1023 |
| 358 | + - 数值范围:约 $4.9 \times 10^{-324}$ ~ $1.8 \times 10^{308}$ |
| 359 | + |
| 360 | + |
| 361 | + |
| 362 | + |
| 363 | + |
| 364 | + |
0 commit comments