Appearance
CISC与RISC
考情分析
两种考法。选择题考核心特征对比,形式固定是"下列关于 RISC 的叙述中,错误的是"——四个选项里三个是 RISC 的真特征、一个把某条颠倒过来(把硬布线说成微程序、把"最适合流水线"说成"难以流水线")。综合题里出现过一次反向用法:给一段反汇编,判断这台机器是 CISC 还是 RISC,2 分。
所以特征表不能只会顺着背,还得能认出被颠倒的那一条。
大纲定位
考纲第四章(五):CISC 和 RISC 的基本概念。
要求到什么程度:能列出两者在指令长度、指令格式种类、寻址方式、寄存器数量、控制器实现等维度的差异,并能由一段反汇编反过来判断这是哪一类机器。
CISC(复杂指令集计算机)
Complex Instruction Set Computer,以 x86(Intel/AMD)为代表。
设计理念:用一条复杂指令完成尽可能多的操作,减少程序的指令条数,降低对编译器的要求(早期编译器能力弱)。
主要特征:
| 特征 | 说明 |
|---|---|
| 指令数量多 | 数百条甚至上千条 |
| 指令长度变长 | 指令长度不固定(如 x86 指令 1~15 字节) |
| 指令格式种类多 | 字段的切分方式有很多套,操作码位数都可能不同 |
| 寻址方式多 | 支持多种复杂寻址(内存 ↔ 内存操作) |
| 控制方式 | 微程序控制(便于设计复杂指令) |
| 访存频繁 | 指令可直接操作内存,不强制 Load/Store |
| 寄存器少 | 通用寄存器数量少(x86 早期只有 8 个) |
| 参数传递 | 寄存器不够用,过程调用的参数多用栈传递 |
| 执行时钟 | 不同指令的执行周期数差异大 |
RISC(精简指令集计算机)
Reduced Instruction Set Computer,以 ARM、MIPS、RISC-V 为代表。
设计理念:只保留最常用的简单指令,通过编译器优化生成高效指令序列,依赖硬件流水线实现高吞吐。
主要特征:
| 特征 | 说明 |
|---|---|
| 指令数量少 | 几十条核心指令 |
| 指令定长 | 所有指令等长(如 MIPS 固定 32 位) |
| 指令格式种类少 | 只有少数几套字段切法,且各套里寄存器号的位置固定 |
| 寻址方式少 | 数据操作在寄存器间进行,访存指令使用基址+偏移,种类远少于 CISC |
| 控制方式 | 硬布线控制(速度快) |
| Load/Store 架构 | 只有 Load/Store 指令访问内存,其余操作均在寄存器间进行 |
| 寄存器多 | 通用寄存器多(MIPS/RISC-V 有 32 个) |
| 参数传递 | 寄存器够用,过程调用的参数多用寄存器传递 |
| 执行时钟 | 大多数指令在一个时钟周期内完成,平均 CPI 接近 1 |
「一个时钟周期完成一条指令」到底在说什么
这句话是对的,但它说的是吞吐不是延迟
"RISC 大多数指令在一个时钟周期内完成"是教材和真题反复出现的正确表述,考场上看到它请直接放过——它不是错误选项。
但它容易被理解偏,所以要分清两个量:
| 量 | 含义 | RISC 五级流水线的值 |
|---|---|---|
| 延迟(一条指令走完全程) | 从取指到写回要经过几个周期 | 5 个周期(IF/ID/EX/MEM/WB) |
| 吞吐(每周期完成几条) | 稳态下平均每个时钟周期完成多少条 | 1 条/周期,即 CPI |
"一个时钟周期完成一条指令"说的是第二行——流水线满载后,每来一个时钟就有一条指令从末端走出来。不是说一条指令从头到尾只花一个周期(那是单周期 CPU 的特征,而单周期 CPU 的时钟周期长得离谱)。
两句话不矛盾:每条指令仍要走 5 个周期,但 5 条指令是重叠着走的。
CISC 做不到这一点,是因为它的指令复杂度差异太大——一条 MOV 和一条串操作指令所需周期数可以差几十倍,没法均衡地切成流水段,平均 CPI 远大于 1。
指令定长 ≠ 指令格式种类少
这是两个互相独立的维度,真题会把它们并列写在同一个选项里("指令数、寻址方式和指令格式种类相对 CISC 少"),所以必须分开理解:
| 维度 | 问的是 | CISC | RISC |
|---|---|---|---|
| 指令长度 | 一条指令占几个字节 | 变长(x86 为 1~15 字节) | 定长(如一律 32 位) |
| 指令格式种类 | 这些位怎么切分成字段,一共有几套切法 | 多,操作码位数都可能不同 | 少,且各套之间字段位置尽量对齐 |
定长完全可以配上很多种格式(同样 32 位,切法可以有几十种)。RISC 两样都要:既定长,格式种类还少。
为什么格式种类少这么重要:因为它让译码可以和读寄存器并行。以 RISC-V 为例,无论是 R 型、I 型还是 S 型指令,rs1 永远在 IR[19:15]——CPU 根本不用等译码结果出来,就可以拿这几位去读寄存器堆。格式一乱,这一步就只能串行等着,流水线的 ID 段立刻被拉长。
所以"精简"精简的从来不只是指令条数,而是四样东西一起:
选择题里把这四样并列说成"相对 CISC 少",是正确叙述。
过程调用的参数怎么传
寄存器多不只是"少访存"这一个好处,它还改变了函数调用的约定:
| 寄存器数量 | 参数怎么传 | |
|---|---|---|
| RISC | 多(32 个) | 前几个参数走寄存器(MIPS 用 a0~a3,ARM 用 r0~r3,RISC-V 用 a0~a7),超出的才压栈;返回值也走寄存器 |
| CISC(x86 早期) | 少(8 个) | 寄存器不够分,参数普遍压栈,被调用方从栈帧里按偏移取 |
寄存器传参的收益很直接:一次调用省掉好几次访存。参数放栈上意味着调用方写内存、被调用方再读内存;放寄存器则完全不碰内存。函数调用在真实程序里极其频繁,这点开销积累起来很可观。
一个容易引起怀疑的细节:x86-64 也用寄存器传参(
rdi、rsi、rdx、rcx、r8、r9),它不是 CISC 吗?是。但这恰好说明寄存器传参的前提是"寄存器够多"——x86-64 把通用寄存器从 8 个扩到 16 个之后才有条件这么做。所以"RISC 多采用寄存器传参"依然是正确叙述:它描述的是 RISC 的典型做法,不是一条只有 RISC 才能满足的排他性定义。
核心对比表
| 特性 | CISC | RISC |
|---|---|---|
| 指令集规模 | 大(数百条) | 小(几十条) |
| 指令长度 | 变长 | 定长 |
| 指令格式种类 | 多 | 少,且字段位置对齐 |
| 寻址方式 | 多种复杂方式 | 少(Load/Store) |
| 控制器实现 | 微程序(ROM 存储) | 硬布线(逻辑电路) |
| 内存访问 | 指令可直接访存 | 只有 Load/Store 访存 |
| 通用寄存器 | 少 | 多 |
| 过程调用传参 | 多用栈 | 多用寄存器 |
| 平均 CPI | 远大于 1 | 接近 1 |
| 流水线 | 难以实现(变长指令),需先拆成微操作 | 天生适合流水线 |
| 编译器要求 | 低(指令复杂,编译简单) | 高(依赖编译器优化) |
| 典型代表 | x86, x86-64 | ARM, MIPS, RISC-V, PowerPC |
微程序控制 vs 硬布线控制
微程序控制:
- 将每条复杂指令分解为微操作,存储在控制存储器(ROM)中
- 修改方便,适合复杂指令集
- 速度较慢(需要查微程序存储器)
硬布线控制:
- 用组合逻辑直接产生控制信号
- 速度快,延迟低
- 设计复杂,修改困难,适合简单固定指令集
RISC 指令简单且定长,硬布线控制电路规模可控,因此速度更快。
Load/Store 架构的含义
RISC 中,只有 LOAD(从内存读到寄存器)和 STORE(从寄存器写到内存)两类指令可以访存。
所有运算都在寄存器之间进行:
# RISC 风格:计算 A + B 并存入 C
LOAD R1, [A] ; 从内存加载 A
LOAD R2, [B] ; 从内存加载 B
ADD R3, R1, R2 ; 寄存器间运算
STORE R3, [C] ; 结果写回内存# CISC 风格:直接内存操作
ADD [C], [A], [B] ; 一条指令完成(但内部很复杂)卷面动作:给一段反汇编,怎么判断它是 RISC 还是 CISC
综合题给一段带虚拟地址和机器码的反汇编,问"计算机 M 是 RISC 还是 CISC?为什么?"——2017 年考过一次,2 分。
主判据:指令长度是否参差。 这是最直观、也是标准答案采用的那一条。机器码那一列直接数字节数就行,也可以用相邻两条指令的虚拟地址相减。
1 00401020 55 push ebp ← 1 字节
20 0040105E 39 4D F4 cmp dword ptr[ebp-0Ch],ecx ← 3 字节
23 00401066 D1 E2 shl edx,1 ← 2 字节
35 0040107F C3 ret ← 1 字节长度有 1、2、3 字节三种
佐证一:寄存器名。 出现 eax、ebp、ecx、edx 这套名字就是 x86(IA-32),x86 是 CISC。这一条不算独立判据,但能让结论落到具体架构上。
佐证二:运算类指令能不能直接访存。 看内存操作数([ebp-0Ch]、dword ptr [...])有没有出现在非 Load/Store 指令上。
上例中 cmp 是比较指令,一个操作数却直接是内存单元 [ebp-0Ch]
答案怎么写:结论 + 主判据即可。例如——"M 是 CISC。理由:图中指令的机器码长度分别为 1、2、3 字节,指令不定长;而 RISC 采用定长指令字(如 MIPS、RISC-V 为 32 位定长)。从
ebp、ecx、edx等寄存器名也可判定为 x86,属 CISC。"这一问只有 2 分,写清"指令不定长"这一条就够。其余角度(是否 Load/Store 架构、指令条数、寻址方式多少)作为备选:万一题面给的片段长度恰好都一样,就换用它们。
现代处理器的融合趋势
现代 x86 处理器(Intel Core, AMD Ryzen)在外部维持 CISC 接口,内部将复杂指令翻译为微操作(μops),用类似 RISC 的核心执行,兼顾兼容性与性能。
ARM 架构从移动端扩展到服务器(Apple M 系列、AWS Graviton),RISC 的能效优势越来越明显。
交互可视化
考点清单
- CISC:变长指令、格式种类多、微程序控制、多寻址方式、少寄存器、指令可直接访存、栈传参
- RISC:定长指令、格式种类少、硬布线控制、Load/Store 架构、多寄存器、寄存器传参、流水线友好
- "精简"精简四样:指令条数、指令长度(统一)、指令格式种类、寻址方式——真题把它们并列说"比 CISC 少"是正确叙述
- 指令定长 ≠ 指令格式种类少,这是两个独立维度,RISC 两样都要
- "RISC 大多数指令一个时钟周期完成"是正确叙述,说的是 CPI
的吞吐,不是一条指令只走一个周期 - RISC 过程调用多用寄存器传参(MIPS
a0~a3、ARMr0~r3),CISC 寄存器少故多用栈 - RISC 最适合流水线,说"RISC 难以采用流水线"是错的——它整套设计就是为流水线服务的
- 微程序控制修改灵活但速度慢;硬布线速度快但设计复杂
- 判断一段反汇编属于哪类:主判据是指令长度是否参差;寄存器名、是否 Load/Store 架构可作佐证
- 现代 CPU 多为混合架构,内部微操作是 RISC 风格
教材出处
- 袁春风《计算机组成与系统结构(第 3 版)》§4.2.7 CISC 和 RISC 风格指令系统:CISC 的由来与 RISC 的七条主要特点(p100~101)
教材那七条里第 (2) 条写的是"指令格式规整。寻址方式少、指令格式少、指令长度一致"——一条里并列了三件事,正好印证上文"定长和格式种类少是两个维度"的说法。