Skip to content

CISC 与 RISC 的基本概念

2026 大纲 四(五)CISC 和 RISC 的基本概念

RISC 的 R 不是"指令少",是"每条指令花的周期少"

程序跑得快不快,只由三个因子决定:

P=I×C×T

I 是执行的指令条数,C 是每条指令平均要几个机器周期,T 是一个周期有多长。RISC 这个名字最容易让人以为它是在压 I——恰恰相反:RISC 程序的指令条数比 CISC 还多 20%~40%。一条 CISC 指令能干的事,RISC 常常要拆成好几条。它压的是 CT,而且压得比 I 涨得更狠,于是乘积变小。

这条主线一旦立住,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)常被理解成"指令变少了",但精简指令本身不是目的——目的是通过简化指令使结构更合理,从而提高性能,主线只有一条:减少指令的执行周期数。执行时间可分解成三个因子:

P=I×C×T

I 是机器指令条数、C 是每条指令平均所需的机器周期数、T 是每个机器周期的执行时间。RISC 用简单指令的组合替代 CISC 的复杂指令,I 反而变大了(比 CISC 多 20%~40%);但大多数指令只用一个机器周期完成,C 小得多,结构简单又使数据通路更短、T 大幅下降。三者相乘,总账仍然是 RISC 划算。

顺着"压低 CT"这条主线,RISC 的七条特征就都能推出来:

特征它在压低哪个因子
① 只选取使用频度高的简单指令,复杂功能由简单指令组合实现让每条指令都能在短周期内完成 → CT
指令长度固定、指令格式种类少、寻址方式种类少译码路径短且规整 → T
只有取数/存数(Load/Store)指令访存,其余操作都在寄存器内完成消除"访存"这个长延迟环节对运算指令的污染 → C
④ CPU 中有大量通用寄存器变量常驻寄存器,减少访存次数 → C
采用流水线技术,大部分指令在一个时钟周期内完成直接压低 C
⑥ 控制器采用组合逻辑(硬布线)控制,不用微程序控制省掉查微程序存储器的时间 → T
⑦ 采用优化的编译程序指令少有利于编译器优化 → I

这七条不是七个独立的选择,而是一个互相支撑的整体。 ②让③更容易实现,②③一起让⑤成为可能,⑤要求⑥(微程序的查表延迟撑不住单周期节拍),而①使⑥的电路规模可控——绕成一个闭环。

第⑤条的措辞要读准:"大部分指令在一个时钟周期内完成"说的是吞吐,不是延迟。一条指令走过五级流水线,从进到出仍然要 5 个周期,这是它的延迟;但流水线每个周期都能吐出一条结果,平均下来 CPI 1,这是吞吐。若真要求单条指令从头到尾只花一个周期,那就是单周期 CPU——而单周期 CPU 的时钟周期必须迁就最慢的那条指令,长得离谱,反而更慢。

编者注(边界):商品化的 RISC 机通常不是纯 RISC,上述特征不是所有 RISC 机都具备。

三、指令定长 ≠ 指令格式种类少

教材在描述 RISC 时把三件事写在同一条里——"寻址方式少、指令格式少、指令长度一致"。这三件事互相独立,必须分开理解:

维度问的是CISCRISC
指令长度一条指令占几个字节变长(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 指令少而规整,硬布线的电路规模完全可控,"设计复杂、修改困难"的分量因此很轻。

核心对比表

特性CISCRISC
指令集规模大(数百条)小(几十条)
指令长度变长定长
指令格式种类少,且字段位置对齐
寻址方式多种复杂方式
内存访问指令可直接访存只有 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 架构。

痕迹三:寄存器的组织方式。 少量、带专用名称的寄存器(eaxebpecx 这类历史称呼)是 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 的核心执行——这也是"变长指令难以直接流水"的工程解法。

考点速记

  1. CISC 的复杂化由软件向后兼容缩小语义差距两条推力造成,80-20 规律同时否掉了它的收益与理由;代价是控制器约占 60% 的芯片面积。
  2. RISC 的目的不是精简指令本身,而是减少指令的执行周期数P=I×C×T 中它的 I 反而多 20%~40%,靠压低 CT 取胜;七条特征(简单指令、格式规整、Load/Store、大量通用寄存器、流水线、硬布线、优化编译)互相支撑成一个闭环。
  3. 指令定长与指令格式种类少是两个独立维度,后者的价值在于让译码与读寄存器并行;控制器选硬布线是被"一个周期完成一条指令"逼出来的,而"大多数指令一个时钟周期完成"说的是 CPI 1 的吞吐,不是单条指令的延迟。

这一节在真题里被考过的形式

  • 给四句关于 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 位 25=32 个通用寄存器,而 32 位的数最多移 31 位,log232=5,所以 shamt 也是 5 位。这道题正好展示 RISC 格式规整的实际形态——三条指令的 rs1 都在 [19:15]rd 都在 [11:7],位置完全对齐,这就是"译码与读寄存器可以并行"的物理前提。做这类题先把字段位置抄成一张对照表再答,比反复回看图快得多。

易错:把"精简指令集"理解成"程序的指令条数少"。RISC 的指令条数反而多 20%~40%,它赢在 CT

易错:认为 RISC 难以流水。整套 RISC 设计就是为流水线做的;难以直接流水的是变长、格式多样的 CISC。

易错:把"大多数指令一个时钟周期完成"当成单条指令的延迟。那是吞吐(CPI 1),延迟仍是流水级数个周期。

易错:把"指令定长"与"指令格式种类少"当成同一件事。同样 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%、P=I×C×T 的分解与 RISC 的 I 比 CISC 多 20%~40%、RISC 七条主要特点及 CISC 的对照描述(印刷页 p326~330)

教材那七条里第 (2) 条写的是"指令长度固定,指令格式种类少,寻址方式种类少"——一条里并列了三件事,正好印证上文"定长与格式种类少是两个独立维度"的说法。

相关知识

硬布线控制器微程序控制器指令流水线的基本概念程序的机器级表示

真题练习