Appearance
CISC 与 RISC 的基本概念
2026 大纲 四(五)CISC 和 RISC 的基本概念。
RISC 的 R 不是"指令少",是"每条指令花的周期少"
程序跑得快不快,只由三个因子决定:
这条主线一旦立住,RISC 那七条特征就不是一张需要背的清单,而是同一个目标推出来的一套连环设计:
- 想让每条指令都在一个周期内做完,指令就必须简单——去掉复杂指令;
- 指令要在固定周期内取完,取指的长度就不能变——定长指令字;
- 想让译码和读寄存器同时进行、不必等译码结果,寄存器号就得永远落在同一段位上——指令格式种类少且字段位置对齐;
- 访存的延迟高且不确定,会把整齐的节拍搅乱,那就把它隔离到两条专门的指令里——Load/Store 架构;
- 运算既然只能在寄存器之间做,寄存器就必须够多——大量通用寄存器,也因此过程调用能用寄存器传参而不必压栈;
- 微程序控制器要先查一次控制存储器才能发出信号,这个延迟撑不住"一个周期一条指令"——只能用硬布线;
- 上面这些都把负担推给了软件,于是依赖优化编译器。
七条互相支撑,缺一条另外六条就失去意义。它们共同服务的那个最终形态就是流水线——所以"RISC 难以采用流水线"这句话是把结论说反了:难以直接流水的是 CISC,RISC 整套设计本来就是为流水线做的。
至于 CISC 为什么会复杂到需要被"精简",以及支撑这次精简的那条经验规律(80-20 规律:典型程序里 80% 的语句只用到 20% 的指令,而且都是取数、加法、转移这类简单指令),是下面第一节的内容。
交互可视化
一、CISC:复杂化是怎么发生的
软件价格相对硬件不断上升,用户希望已开发的软件能被继承,新机种因此必须包含旧机种的全部指令和寻址方式——DEC 的 VAX-11/780 就有 16 种寻址方式、9 种数据格式、303 条指令。另一条推力是缩小与高级语言的语义差距:机器指令若本身就接近高级语言语句的功能,早期薄弱的编译技术就轻松得多。两条推力共同作用的结果是这样一套指令系统:
| 特征 | 具体表现 |
|---|---|
| 指令数量多 | 数百条甚至上千条 |
| 指令长度可变 | 一条指令从 1 字节到十几字节不等 |
| 指令格式种类多 | 字段切分方式有很多套,连操作码位数都可能不同 |
| 寻址方式多 | 支持复杂寻址,可以内存对内存操作 |
| 访存不受限 | 运算指令可以直接操作内存单元 |
| 通用寄存器少 | 早期只有 8 个 |
| 控制器实现 | 微程序控制(便于实现复杂指令) |
| 执行周期 | 不同指令所需周期数差异极大 |
对大量典型程序的统计给出了一条著名的经验规律——80-20 规律,它同时否掉了复杂化的两个理由:收益低(付出巨大代价添加的复杂指令,使用概率只有 20%),而且还有反作用——控制器要兼顾所有指令,译码路径和时序被最复杂的那条拖住,简单指令的速度也提不上去。代价则是实打实的:典型 CISC 计算机中控制器约占 60% 的芯片面积,设计、验证与实现都更困难。
二、RISC:一条主线串起全部特征
RISC(Reduced Instruction Set Computer)常被理解成"指令变少了",但精简指令本身不是目的——目的是通过简化指令使结构更合理,从而提高性能,主线只有一条:减少指令的执行周期数。执行时间可分解成三个因子:
顺着"压低
| 特征 | 它在压低哪个因子 |
|---|---|
| ① 只选取使用频度高的简单指令,复杂功能由简单指令组合实现 | 让每条指令都能在短周期内完成 → |
| ② 指令长度固定、指令格式种类少、寻址方式种类少 | 译码路径短且规整 → |
| ③ 只有取数/存数(Load/Store)指令访存,其余操作都在寄存器内完成 | 消除"访存"这个长延迟环节对运算指令的污染 → |
| ④ CPU 中有大量通用寄存器 | 变量常驻寄存器,减少访存次数 → |
| ⑤ 采用流水线技术,大部分指令在一个时钟周期内完成 | 直接压低 |
| ⑥ 控制器采用组合逻辑(硬布线)控制,不用微程序控制 | 省掉查微程序存储器的时间 → |
| ⑦ 采用优化的编译程序 | 指令少有利于编译器优化 → |
这七条不是七个独立的选择,而是一个互相支撑的整体。 ②让③更容易实现,②③一起让⑤成为可能,⑤要求⑥(微程序的查表延迟撑不住单周期节拍),而①使⑥的电路规模可控——绕成一个闭环。
第⑤条的措辞要读准:"大部分指令在一个时钟周期内完成"说的是吞吐,不是延迟。一条指令走过五级流水线,从进到出仍然要 5 个周期,这是它的延迟;但流水线每个周期都能吐出一条结果,平均下来 CPI
编者注(边界):商品化的 RISC 机通常不是纯 RISC,上述特征不是所有 RISC 机都具备。
三、指令定长 ≠ 指令格式种类少
教材在描述 RISC 时把三件事写在同一条里——"寻址方式少、指令格式少、指令长度一致"。这三件事互相独立,必须分开理解:
| 维度 | 问的是 | CISC | RISC |
|---|---|---|---|
| 指令长度 | 一条指令占几个字节 | 变长(1~15 字节) | 定长(如一律 32 位) |
| 指令格式种类 | 这些位怎么切分成字段,一共有几套切法 | 多,连操作码位数都可能不同 | 少,且各套之间字段位置尽量对齐 |
| 寻址方式种类 | 有多少种解释地址码的方式 | 多,含内存对内存 | 少 |
格式种类少为什么这么重要:因为它让译码可以与读寄存器并行。以典型的 RISC 指令集为例,无论 R 型、I 型还是 S 型指令,源寄存器号永远落在同一段位上——CPU 根本不必等译码结果出来,就可以拿这几位去读寄存器堆。格式一乱,这一步只能串行等待,流水线的译码段立刻被拉长。所以"精简"精简的从来不只是指令条数,而是四样东西一起:
四、Load/Store 架构
RISC 中,只有 LOAD(内存 STORE(寄存器
# Load/Store 风格:计算 A + B 存入 C
LOAD R1, [A]
LOAD R2, [B]
ADD R3, R1, R2 ; 纯寄存器运算
STORE R3, [C]# 允许直接访存的风格
ADD [C], [A], [B] ; 一条指令完成,内部却要三次访存上面那条 ADD [C], [A], [B] 正是"指令数少"的代价所在:它的执行时间取决于三次访存,与一条寄存器加法完全不在一个量级。Load/Store 的真正收益是规整——把访存这个高延迟、时间不确定的动作隔离到两条专门的指令里,其余指令的执行时间才整齐划一,流水线才切得均匀。
五、寄存器数量改变了参数传递方式
| 通用寄存器 | 参数怎么传 | |
|---|---|---|
| RISC | 多(典型为 32 个) | 前几个参数走寄存器,超出的才压栈;返回值也走寄存器 |
| CISC(早期 x86) | 少(8 个) | 寄存器不够分,参数普遍压栈,被调用方从栈帧里按偏移读取 |
收益很直接:一次调用省掉好几次访存——参数放栈上意味着调用方写内存、被调用方再读内存,放寄存器则完全不碰内存。栈帧细节见 程序的机器级表示。
六、控制器:硬布线还是微程序
| 微程序控制 | 硬布线控制 | |
|---|---|---|
| 怎么产生控制信号 | 把每条指令分解为微操作序列,存在控制存储器(ROM)里,逐条取出 | 用组合逻辑电路直接产生 |
| 速度 | 慢(每个微操作都要访问一次控制存储器) | 快(一级组合逻辑延迟) |
| 修改 | 改 ROM 内容即可,灵活 | 要重新设计电路,困难 |
| 适合 | 指令复杂、种类多 | 指令简单、规整、数量少 |
两者的分工是被指令系统逼出来的:CISC 指令种类多、微操作序列长且各不相同,用组合逻辑实现电路规模会爆炸,只能把复杂性搬进 ROM;RISC 指令少而规整,硬布线的电路规模完全可控,"设计复杂、修改困难"的分量因此很轻。
核心对比表
| 特性 | CISC | RISC |
|---|---|---|
| 指令集规模 | 大(数百条) | 小(几十条) |
| 指令长度 | 变长 | 定长 |
| 指令格式种类 | 多 | 少,且字段位置对齐 |
| 寻址方式 | 多种复杂方式 | 少 |
| 内存访问 | 指令可直接访存 | 只有 Load/Store 访存 |
| 通用寄存器 | 少 | 多 |
| 过程调用传参 | 多用栈 | 多用寄存器 |
| 控制器实现 | 微程序(ROM) | 硬布线(组合逻辑) |
| 平均 CPI | 远大于 1 | 接近 1 |
| 流水线 | 难以直接实现,需先拆成微操作 | 整套设计就是为流水线服务的 |
| 编译器要求 | 低 | 高(依赖编译优化) |
从一段反汇编上认出风格:三处可直接观察的痕迹(拿到一段机器代码要判断它属于哪类风格时展开)
痕迹一:指令长度是否参差。 定长指令机器上,任意相邻两条指令的地址差恒为同一个数(如 4);变长指令机器上,这个差值随指令不同而变化。
00401020 55 push ebp ← 1 字节
0040105E 39 4D F4 cmp dword ptr [ebp-0Ch],ecx ← 3 字节
00401066 D1 E2 shl edx,1 ← 2 字节
0040107F C3 ret ← 1 字节同一段代码里出现 1、2、3 字节三种长度,说明这是变长指令机器。RISC 则相反——定长指令字是它整套设计的地基。
痕迹二:运算类指令能不能直接带内存操作数。 上面那条 cmp 是比较指令,一个操作数却直接是内存单元 [ebp-0Ch]。在 Load/Store 架构里这是不允许的——比较之前必须先 LOAD 到寄存器。内存操作数出现在非 Load/Store 指令上,就说明这台机器不是 Load/Store 架构。
痕迹三:寄存器的组织方式。 少量、带专用名称的寄存器(eax、ebp、ecx 这类历史称呼)是 CISC 的典型特征;大量、按编号排列且用途高度对称的寄存器组(32 个通用寄存器)则是 RISC 的做法。这一条不构成独立判据,但能把观察结果落到具体架构上。
三处痕迹互相印证的原因,正是第二节那个闭环:定长指令、Load/Store、大寄存器组是同一套设计的三个侧面,很难只出现其中一样。
两条路线在实现层怎么趋同的:x86-64 的寄存器传参与 RISC 没能取代 x86 的原因(做"为什么 x86 还活着""x86-64 用寄存器传参算不算 RISC"这类概念判断时展开)
x86-64 也用寄存器传参,它不是 CISC 吗? 是。但这恰好说明寄存器传参的前提是"寄存器够多"——x86-64 把通用寄存器从 8 个扩到 16 个之后才有条件这么做。"RISC 多采用寄存器传参"描述的是典型做法,不是一条只有 RISC 才能满足的排他性定义。
RISC 没能在 PC 与服务器市场取代 x86,主要原因有两条:软件的向后兼容性(用户先期投资的软件换架构就要重新投入)以及 CISC 吸收了部分 RISC 技术后性能大幅提升。而在移动设备和嵌入式领域,RISC 处理器则占据绝对优势。
现代 x86 的具体做法是:在外部维持 CISC 接口以保证软件兼容,内部把复杂指令翻译成微操作,再对微操作流水,用类似 RISC 的核心执行——这也是"变长指令难以直接流水"的工程解法。
考点速记
- CISC 的复杂化由软件向后兼容与缩小语义差距两条推力造成,80-20 规律同时否掉了它的收益与理由;代价是控制器约占 60% 的芯片面积。
- RISC 的目的不是精简指令本身,而是减少指令的执行周期数:
中它的 反而多 20%~40%,靠压低 与 取胜;七条特征(简单指令、格式规整、Load/Store、大量通用寄存器、流水线、硬布线、优化编译)互相支撑成一个闭环。 - 指令定长与指令格式种类少是两个独立维度,后者的价值在于让译码与读寄存器并行;控制器选硬布线是被"一个周期完成一条指令"逼出来的,而"大多数指令一个时钟周期完成"说的是 CPI
的吞吐,不是单条指令的延迟。
这一节在真题里被考过的形式:
- 给四句关于 RISC 的叙述,挑出错的那一句(2009-17、2025-17,相隔十六年考同一道题的两个变体)。两次的正确答案都落在同一条特征上:2009-17 的错项是"RISC 普遍采用微程序控制器",2025-17 的错项是"RISC 难以采用流水线数据通路实现微架构"。这两句其实是一回事的两面——RISC 用硬布线正是为了配合流水线,把控制器说成微程序、或者说它难以流水,都是在否定同一条设计闭环。其余选项(大多数指令一个周期完成、通用寄存器多、指令与寻址方式种类少、Load/Store 风格、寄存器传参)全都是七条特征的直接复述。这类题不必逐条比对,先在四句里找那条与"为流水线服务"相冲突的。
- 给一段真实反汇编,判断这台机器是 CISC 还是 RISC 并说明理由(2017-44 第 1 问)。理由要落在可观察的痕迹上,不能只答"因为它是 x86"。该题给的代码里,
push ebp占 1 字节、shl edx,1占 2 字节、cmp dword ptr [ebp-0Ch],ecx占 3 字节——指令长度不等,这是最直接的一条;同一条cmp还直接把内存单元当操作数,说明它不是 Load/Store 架构。两条痕迹指向 CISC。展开的三处观察点见下方折叠块。 - 读 RISC-V 的指令格式,逐字段回答问题(2024-43)。题面给出
add/slli/lw三条指令的位段划分,问"最多有多少个通用寄存器""为什么shamt占 5 位"。两问共用一个答案来源:寄存器号字段 5 位个通用寄存器,而 32 位的数最多移 31 位, ,所以 shamt也是 5 位。这道题正好展示 RISC 格式规整的实际形态——三条指令的rs1都在、 rd都在,位置完全对齐,这就是"译码与读寄存器可以并行"的物理前提。做这类题先把字段位置抄成一张对照表再答,比反复回看图快得多。
易错:把"精简指令集"理解成"程序的指令条数少"。RISC 的指令条数反而多 20%~40%,它赢在
和 。
易错:认为 RISC 难以流水。整套 RISC 设计就是为流水线做的;难以直接流水的是变长、格式多样的 CISC。
易错:把"大多数指令一个时钟周期完成"当成单条指令的延迟。那是吞吐(CPI
),延迟仍是流水级数个周期。
易错:把"指令定长"与"指令格式种类少"当成同一件事。同样 32 位定长,切分成字段的方式可以有几十种。
易错:认为寄存器传参是 RISC 的排他性定义。x86-64 把通用寄存器扩到 16 个之后同样用寄存器传参,它仍是 CISC。
教材出处
- 袁春风《计算机组成与系统结构(第 3 版)》§4.2.7 指令系统设计风格:CISC 的由来(VAX-11/780 的 16 种寻址方式、9 种数据格式、303 条指令)、20% 的简单指令占程序代码 80% 以上、RISC 的七条主要特点、RISC 未能取代 x86 的两点原因与在嵌入式领域的优势(印刷页 p100~101)
- 唐朔飞《计算机组成原理(第 3 版)》§7.5 RISC 技术:软件兼容推动指令系统膨胀、80-20 规律、控制器约占 CISC 芯片面积 60%、
的分解与 RISC 的 比 CISC 多 20%~40%、RISC 七条主要特点及 CISC 的对照描述(印刷页 p326~330)
教材那七条里第 (2) 条写的是"指令长度固定,指令格式种类少,寻址方式种类少"——一条里并列了三件事,正好印证上文"定长与格式种类少是两个独立维度"的说法。
相关知识
硬布线控制器|微程序控制器|指令流水线的基本概念|程序的机器级表示