1. 为什么指令系统和CPU是408计组的“硬骨头”
如果你正在准备408,或者本科学的是计算机组成原理,翻到“指令系统”和“中央处理器”这两章时大概率会有一种感受:前面的数据表示还能靠背公式混过去,到了这里,突然就要在脑子里搭建一台能跑起来的机器。指令格式怎么设计、寻址方式为什么要有这么多种、CPU里面那些寄存器到底谁控制谁——单看文字都认识,合上书就散架。
这篇笔记就是我在复习408计组时,针对指令系统和CPU这两块做的系统梳理。它适合两类人:一类是正在啃王道408或者教材、需要把零散知识点串成一条线的考研党;另一类是做计组课设、需要理解基本模型机指令执行流程的本科生。我不会只列知识点,而是尽量回答“为什么要这样设计”“这个部件不这样做行不行”这类问题。毕竟408现在的考题越来越偏向理解而非死记,尤其是CPU那道大题,往往会把数据通路、指令周期、微操作揉在一起考你。
需要说明的是,下面的内容基于王道408复习指导、唐朔飞《计算机组成原理》以及常见的模型机课设方案整理,部分细节补充了我个人做题和做课设时的理解。如果你手头有指定教材,建议对照着看,更容易形成自己的知识框架。
2. 指令系统:从一条指令的编码开始拆解
2.1 指令格式设计的底层逻辑
一条指令说到底就是一组二进制代码,但怎么划分这些比特位,直接决定了CPU的复杂度和程序员的编程体验。最核心的划分就是操作码字段和地址码字段。操作码告诉CPU“做什么”,地址码告诉CPU“对谁做”。
为什么地址码数量不固定?这背后是指令字长和地址码长度的权衡。假设指令字长固定为32位,如果操作码占8位,剩下24位可以支持三地址指令(每个地址8位);但如果操作码需要扩展到12位来支持更多指令类型,那地址码就只能剩20位,三地址就放不下了,只能改成二地址或一地址。这就是扩展操作码技术要解决的问题:让操作码长度随地址码数量变化,短操作码留给常用的三地址指令,长操作码留给不常用的零地址或一地址指令。
我在复习时总结了一个判断扩展操作码题目的通用方法:从地址码最多的指令开始分配,逐级缩短地址码数量,同时记录剩余编码空间。比如题目说“指令字长16位,每个地址码4位,要求三地址指令15条,二地址指令12条,一地址指令8条,零地址指令若干”,你就先给三地址留4位操作码,15条用掉15个编码,还剩16-15=1个编码可以扩展给二地址;二地址操作码变成8位(4位基础+4位扩展),可用编码是1×16=16个,用掉12个,还剩4个扩展给一地址;一地址操作码12位,可用4×16=64个,用掉8个,剩下56个给零地址。这样算下来零地址最多56条。这个计算过程在408选择题里反复出现,务必练熟。
注意:扩展操作码的题目千万不要凭感觉猜,一定要画一个编码空间的树状分配图,每层标注“基础编码数×扩展位数=可用编码数”,再逐层扣减。我第一遍做这类题时经常忘记把上一级剩余的编码数乘进去,导致结果差一个数量级。
2.2 寻址方式:不只是记住名字,要理解为什么需要它
寻址方式这一块,王道书列了七八种,很多同学背完就忘。我建议换一个角度:每一种寻址方式都是为了解决特定场景下的地址计算问题。
立即寻址:操作数直接放在指令里,取指令的同时就拿到了操作数,速度最快。但问题是操作数大小受指令字长限制,而且程序运行中不能修改。适合给变量赋初值、做常量运算。
直接寻址:指令里放的是操作数的内存地址。访问一次内存就能拿到操作数,简单直接。但地址空间受指令地址码长度限制,比如地址码只有16位,就只能寻址64KB内存。
间接寻址:指令里放的是“操作数地址的地址”。需要两次访存才能拿到操作数,速度慢,但寻址范围大大扩展——因为存储字长通常比地址码长,可以用一个存储字来存放完整的地址。而且间接寻址可以实现子程序返回时的地址修改,这是它不可替代的优势。
寄存器寻址:操作数放在寄存器里,不需要访存,速度快,指令字长也短(只需指定寄存器编号)。但寄存器数量有限,能放的数据量小。
寄存器间接寻址:寄存器里放的是操作数的内存地址。比间接寻址少一次访存,又比寄存器寻址寻址范围大,是平衡速度和范围的常用方案。
相对寻址:地址 = PC当前值 + 偏移量。这个设计主要是为了程序浮动——代码加载到内存任意位置都能正确跳转,因为偏移量是相对于当前指令的。408考题经常在这里挖坑:PC当前值到底是指“当前正在执行的指令地址”还是“下一条指令地址”?答案是下一条指令的地址,因为取指完成后PC已经自动加了指令长度。这一点我在做真题时错过不止一次。
基址寻址:地址 = 基址寄存器内容 + 偏移量。基址寄存器由操作系统管理,程序运行时基址不变,偏移量变。用于多道程序重定位,操作系统给每个程序分配一个基地址,程序内部用偏移量访问。
变址寻址:地址 = 变址寄存器内容 + 偏移量。变址寄存器的内容可以由用户程序修改,偏移量通常来自指令。用于数组遍历——变址寄存器当循环变量,偏移量当数组首地址,每轮循环变址寄存器自增。
我把这一堆寻址方式整理成一张对比表,做题时对着表推:
| 寻址方式 | 有效地址来源 | 访存次数(取操作数) | 典型用途 |
|---|---|---|---|
| 立即寻址 | 指令中直接给出 | 0 | 常量赋值 |
| 直接寻址 | 指令地址码字段 | 1 | 简单变量访问 |
| 间接寻址 | 指令地址码指向的存储单元 | 2 | 子程序返回、扩展寻址 |
| 寄存器寻址 | 寄存器编号 | 0 | 高频变量、中间结果 |
| 寄存器间接 | 寄存器内容 | 1 | 指针操作 |
| 相对寻址 | PC + 偏移量 | 1 | 转移指令、程序浮动 |
| 基址寻址 | 基址寄存器 + 偏移量 | 1 | 程序重定位 |
| 变址寻址 | 变址寄存器 + 偏移量 | 1 | 数组遍历 |
实操心得:做寻址方式题目时,先看“操作数在哪里”——在指令里就是立即,在寄存器里就是寄存器,在内存里就是直接/间接/相对/基址/变址。再看“地址怎么算”——直接给就是直接,通过寄存器就是寄存器间接,PC加偏移就是相对,基址寄存器加偏移就是基址,变址寄存器加偏移就是变址。这样两步判断,基本不会错。
2.3 CISC与RISC:不是谁替代谁,而是设计哲学不同
CISC(复杂指令集)和RISC(精简指令集)的对比是408高频考点,但很多同学只背了“CISC指令多,RISC指令少”,遇到大题就写不出东西。我理解这两者的区别时,抓住一个核心:CISC用复杂的硬件来简化软件,RISC用简单的硬件并要求编译器做更多优化。
CISC的思路是“一条指令干一件事”,比如x86里有专门的字符串复制指令、十进制调整指令。好处是汇编程序员写代码方便,代码密度高,内存占用小。代价是硬件译码器极其复杂,指令执行周期长短不一,很难做流水线。
RISC的思路是“把常用指令做到极致快”,只保留load/store访存、算术逻辑运算、跳转这几类简单指令,每条指令定长、单周期。复杂的操作由编译器拆成多条简单指令完成。好处是硬件简单、适合流水线、时钟频率容易做高。代价是代码体积大,对编译器要求高。
408考试里常考的一个对比点是寄存器数量:RISC通常有大量通用寄存器(32个以上),因为load/store架构下所有运算都在寄存器之间进行,必须减少访存。CISC寄存器少,因为很多操作可以直接在内存上做。
另一个常考点是指令流水线:RISC定长指令让取指、译码、执行各阶段时间均衡,天然适合流水线。CISC指令长度可变,流水线要处理指令对齐、跨边界取指等问题,复杂度高很多。
我在做课设时用的是RISC风格的模型机,全部指令16位定长,操作码4位,寄存器地址3位,立即数或偏移量9位。这个设计的好处是取指阶段永远只读一个存储字,译码逻辑可以用纯组合电路实现,流水线很容易插入。如果你也在做计组课设,强烈建议从RISC风格入手,硬件调试难度会低很多。
2.4 扩展操作码计算:一道题讲透所有变形
扩展操作码是选择题里最容易失分的地方,我把常见变形整理一下。
基本型:指令字长固定,地址码数量递减,操作码长度递增。解法就是前面说的树状分配。
带变长地址码型:题目可能说“三地址指令地址码各4位,二地址指令地址码各6位”,这时候操作码长度变化就不是简单的4位递增了。你需要先算出每种格式下地址码占多少位,再反推操作码可用位数。
限制操作码最小值型:题目说“操作码至少4位”,意思是你不能用少于4位的操作码,这会影响扩展时的基础位数。
求某类指令最大数量型:通常从地址码最多的指令开始正向推导,每级扣减已用编码,剩余编码乘以扩展因子给下一级。
我踩过的一个坑是:忘记零地址指令的操作码可以继续扩展。比如一地址指令操作码12位,剩余56个编码,零地址指令的操作码就是16位(12+4),可用56×16=896条。但如果零地址指令操作码也固定为12位,那就只有56条。题目问“最多”时,要允许继续扩展;题目问“固定格式”时,就不能扩展。这个区别一定要看清。
3. CPU内部构造:数据通路不是画着玩的
3.1 从寄存器出发理解CPU
CPU里面那一堆寄存器,初学者最容易记混。我建议按“谁在用”来分类:
用户可见寄存器:程序员可以通过指令直接访问的。包括通用寄存器(AX、BX等)、程序计数器PC、状态字寄存器PSW。PC存放下一条指令的地址,PSW存放条件码和标志位。这些寄存器在汇编层面就能操作。
用户不可见寄存器:CPU内部用于暂存指令和数据的。包括指令寄存器IR、存储器地址寄存器MAR、存储器数据寄存器MDR、暂存寄存器、微程序控制器里的微指令寄存器等。这些寄存器对程序员透明,但做题时必须清楚它们在指令周期各阶段的作用。
我画数据通路时有一个习惯:先标出所有寄存器,再用箭头标数据流向,最后标控制信号。比如取指周期要做的事情是:PC→MAR,M(MAR)→MDR,MDR→IR,PC+1→PC。这四步微操作对应的控制信号是PCout、MARin、MemRead、MDRout、IRin、PC+1。把控制信号标在箭头上,数据通路就活了。
注意:408大题经常给一个不完整的数据通路图,让你补全连线或控制信号。判断连线是否正确的标准是:数据能不能从源部件流到目的部件,中间经过的部件是否允许数据通过。比如要把MDR的内容送到IR,中间如果经过ALU,那ALU必须设置为“直通”模式,否则数据会被运算改变。
3.2 指令周期:四个阶段不是孤立的
指令周期通常分为取指周期、间址周期、执行周期、中断周期。很多同学把每个周期单独背,结果做题时串不起来。
我的理解是:取指周期是所有指令共有的,间址周期只在需要间接寻址时才有,执行周期因指令而异,中断周期只在响应中断时进入。这四者不是流水线式的固定顺序,而是根据指令类型和当前状态动态决定的。
取指周期结束后,CPU根据指令的操作码决定下一步:如果是直接寻址,直接进执行周期;如果是间接寻址,先进间址周期取有效地址,再进执行周期;如果此时有中断请求且允许中断,在执行周期结束后进中断周期。
执行周期里具体做什么,取决于指令类型。加法指令要取操作数、做加法、存结果;跳转指令要修改PC;访存指令要计算地址、读/写内存。408大题常考的是根据指令周期画出微操作序列,我的方法是:先写出这条指令的功能(如“把内存地址为X的数据加到寄存器R1”),再拆成“取指→取数→运算→存数”四个步骤,每个步骤对应一组微操作。
微操作序列的书写规范要记住:源部件在前,目的部件在后,中间用箭头连接;控制信号通常与微操作对应,如PCout表示PC输出到总线。多个微操作如果能在同一个时钟周期内并行完成,可以写在同一行;如果存在数据依赖,必须分先后。
3.3 硬布线控制器与微程序控制器:两种思路的取舍
控制器是CPU的指挥中心,负责产生控制信号。硬布线控制器用组合逻辑电路直接产生控制信号,微程序控制器用存储在控制存储器里的微指令来产生控制信号。
硬布线控制器的优点是速度快,因为信号是组合逻辑直接产生的,没有访存开销。缺点是设计复杂,一旦设计完成就很难修改,适合RISC这种指令格式规整的架构。其实质是用硬件换速度。
微程序控制器的优点是设计规整、易于修改,增加一条新指令只需要在控制存储器里增加一段微程序。缺点是速度慢,每条机器指令都要执行若干条微指令,每条微指令都要访问控制存储器。其实质是用速度换灵活性。
408考试里常考的是微程序控制器的相关概念:微指令是控制存储器中的一个字,包含若干微命令;微命令是直接控制某个部件动作的信号;微操作是微命令对应的具体动作。三者关系是:一条微指令包含多个微命令,每个微命令控制一个微操作。
微指令的编码方式也是考点:直接编码速度快但微指令字长;字段直接编码把互斥的微命令分在同一字段,通过译码产生控制信号,缩短了微指令字长但增加了译码延迟;字段间接编码进一步压缩字长,但译码更复杂。
我在复习时总结了一个判断微指令编码方式的技巧:看题目给的微指令格式图,如果每个微命令占一位,就是直接编码;如果分组后每组有译码器,就是字段直接编码;如果译码器的输出还要再经过译码,就是字段间接编码。做题时直接对照格式图判断,比背定义快得多。
3.4 数据通路与指令执行:用一条加法指令串起所有部件
为了把CPU内部构造讲透,我用一条典型的加法指令ADD R1, (R2)来说明数据通路的工作过程。这条指令的含义是:把寄存器R2内容指向的内存单元中的数据,加到寄存器R1中,结果存回R1。
取指周期:
- PCout, MARin:PC内容送到MAR
- MemRead:读内存
- MDRin:内存数据送到MDR
- MDRout, IRin:MDR内容送到IR
- PC+1:PC自增
译码阶段:
- IRout:指令送到译码器
- 译码器产生控制信号
执行周期(假设R2已经是有效地址,无需间址):
- R2out, MARin:R2内容送到MAR(作为内存地址)
- MemRead:读内存
- MDRin:数据送到MDR
- MDRout, ALUin:MDR内容送到ALU输入端
- R1out, ALUin:R1内容送到ALU另一端
- ALU做加法
- ALUout, R1in:结果写回R1
这个过程中,数据总线是共享的,所以同一时刻只能有一个部件输出到总线。控制信号的作用就是决定“谁输出、谁输入”。408大题经常让你判断某个微操作序列是否可行,判断依据就是同一时刻总线上是否有多个源部件同时输出。如果有,就是冲突,需要拆成多个时钟周期。
实操心得:刚开始画微操作序列时,我总是忘记PC自增。后来养成习惯:只要进入取指周期,第一件事就是写PCout→MAR,最后一件事就是写PC+1→PC。这样就不会漏。另外,MDR和IR之间的数据传输几乎是所有指令取指阶段的固定动作,可以当成模板记下来。
4. 模型机课设:从理论到能跑的机器
4.1 基本模型机的设计思路
如果你做的是西电计组课设那样的基本模型机,通常要求设计一套指令集,并用硬件描述语言或仿真软件实现取指、译码、执行流程。我的建议是:先定指令格式,再定数据通路,最后写控制器。
指令格式方面,课设通常要求支持至少8条指令,包括算术运算、逻辑运算、访存、跳转。我选择的是16位定长指令,格式如下:操作码4位,目的寄存器3位,源寄存器3位,剩余6位作为立即数或偏移量。这个格式支持8个通用寄存器,6位立即数范围是-32到31,对于简单课设够用了。
数据通路方面,需要一个ALU、一个寄存器堆(8个寄存器)、一个存储器(指令和数据统一编址)、以及PC、IR、MAR、MDR等寄存器。总线宽度16位,所有部件通过总线连接。
控制器方面,我用的是硬布线控制器,因为指令少、格式规整,硬布线比微程序更简单。控制信号用真值表生成,输入是指令操作码和当前周期,输出是各寄存器的读写使能和ALU操作选择。
4.2 指令执行流程的Verilog实现要点
课设通常要求用Verilog写一个顶层模块,实例化CPU核心和存储器。我贴出取指阶段的关键代码思路:
// 取指阶段 always @(posedge clk) begin if (state == FETCH) begin MAR <= PC; MDR <= mem[MAR]; IR <= MDR; PC <= PC + 1; state <= DECODE; end end译码阶段根据IR中的操作码设置控制信号:
always @(*) begin case (IR[15:12]) 4'b0001: begin // ADD reg_write = 1; alu_op = ADD; src_reg = IR[8:6]; dst_reg = IR[5:3]; end 4'b0010: begin // LOAD mem_read = 1; reg_write = 1; addr_reg = IR[8:6]; dst_reg = IR[5:3]; end // 其他指令... endcase end执行阶段根据控制信号完成运算和写回。这里的关键是时序:取指和译码可以合在一个周期,但访存和写回通常需要分开,因为存储器读有延迟。我在课设里用了三个状态:FETCH、EXECUTE、WRITEBACK,简单指令可以跳过WRITEBACK。
注意:写Verilog时最容易犯的错误是在同一个always块里既用阻塞赋值又用非阻塞赋值。我的建议是:时序逻辑(带posedge clk)一律用非阻塞赋值
<=,组合逻辑(always @(*))一律用阻塞赋值=。这样仿真和综合结果一致,不会出现奇怪的竞争。
4.3 课设调试中常见的坑
坑一:总线冲突。仿真时发现某个寄存器值突然变成X,大概率是两个部件同时往总线上输出。检查方法是看同一时刻是否有两个out信号同时有效。解决办法是加优先级仲裁,或者拆成两个周期。
坑二:PC值不对。跳转指令执行后PC没有跳到目标地址,原因通常是PC更新逻辑和取指逻辑冲突。我的解决办法是让PC只在时钟上升沿更新,跳转时直接把目标地址赋给PC,而不是先加到PC再跳。
坑三:存储器读写时序。如果存储器是同步读,读数据要等一个周期才能出来,但代码里当成组合逻辑用了,结果读到的是旧数据。解决办法是在状态机里加一个等待状态,或者把存储器改成异步读。
坑四:复位后状态不确定。仿真开始时所有寄存器都是X,程序跑飞。解决办法是在复位信号有效时把所有寄存器和状态机都置初值,尤其是PC要置0,状态机要置FETCH。
这些坑我在课设里全踩过一遍,每一个都花了大半天才定位到。如果你也在做类似的课设,建议先用一个最简单的测试程序(比如只做一次加法)跑通全流程,再逐步增加指令。
5. 真题实战:指令系统与CPU大题怎么拿分
5.1 数据通路类大题的分析套路
408的CPU大题通常给一个数据通路图,然后问某条指令的执行需要哪些微操作、控制信号如何设置、某个部件的位宽是多少。我的分析套路分三步:
第一步,确定指令类型和寻址方式。题目会明确说“指令OP为加法,采用寄存器间接寻址”,你需要立刻反应过来:要访存取操作数,需要间址周期。
第二步,写出指令功能的形式化描述。比如ADD (R1), R2表示“把R1指向的内存单元内容与R2相加,结果存回该内存单元”。形式化描述写清楚了,微操作就不会漏。
第三步,对照数据通路图逐条写微操作。从PC开始,到PC结束,中间经过的每个部件都写清楚。注意源和目的,注意总线冲突。
举个例子,ADD (R1), R2的微操作序列(假设间址周期完成,R1已是有效地址):
- R1out, MARin
- MemRead
- MDRin
- MDRout, ALUin
- R2out, ALUin
- ALUadd
- ALUout, MDRin
- MemWrite
这里最后一步是写内存,控制信号是MemWrite,数据来自MDR。如果题目问“需要几个时钟周期”,就数微操作的组数,有依赖的不能并行。
5.2 流水线冲突的解题模板
流水线是CPU章节的另一个高频考点,尤其是数据冲突和控制冲突。我总结的判断方法是:
结构冲突:看同一个部件是否在同一周期被多条指令使用。比如指令存储器和数据存储器如果不分开,取指和访存就会冲突。解决办法是分离指令Cache和数据Cache,或者插入气泡。
数据冲突:看后续指令是否使用了前面指令尚未写回的结果。RAW(写后读)是最常见的。解决办法是数据转发(旁路)、插入气泡、编译器调度。
控制冲突:看转移指令是否在目标地址确定前就取了后续指令。解决办法是分支预测、延迟槽、插入气泡。
408大题常考的是计算流水线执行N条指令的总周期数。公式是:总周期 = 流水线深度 + (指令数 - 1) + 冲突导致的停顿周期。如果没有冲突,就是理想流水线;如果有数据冲突且不能转发,每条冲突指令停顿2个周期;如果能转发,停顿1个周期或不停顿。
我踩过的一个坑是:忘记流水线建立时间。比如5段流水线执行10条指令,总周期是5 + (10-1) = 14,不是10。这个“建立时间”就是第一条指令走完所有段的时间。
注意:做流水线题目时,先画时空图。横轴是周期,纵轴是指令,每条指令占一行,每个周期占一列。在图上标出冲突位置和停顿,再数总周期。画图比套公式可靠,尤其是题目有转发和分支预测时,公式容易漏情况。
5.3 微程序控制器大题的关键得分点
微程序控制器的大题通常给一个微指令格式,问控制存储器的容量、微指令的条数、某条机器指令对应的微程序。得分点有三个:
第一,算控制存储器容量。容量 = 微指令条数 × 微指令字长。微指令条数等于所有机器指令对应的微程序长度之和,加上公共的取指微程序。微指令字长包括微操作控制字段、下地址字段、判别字段等。
第二,判断微指令编码方式。看微操作控制字段是否分组,每组是否有译码器。直接编码每位一个微命令,字段直接编码每组译码后产生多个微命令。
第三,写微程序流程。每条机器指令的微程序通常以“取指微指令”开始,然后根据操作码跳到对应的执行微程序。执行微程序里按微操作序列写微指令,每条微指令包含若干微命令。最后一条微指令的下地址指向取下一条机器指令的微指令。
我复习时把王道书上的微程序控制器例题反复做了三遍,发现出题套路很固定:给一个数据通路和微指令格式,让你补全微程序或计算容量。只要把取指微程序和执行微程序的边界搞清楚,基本不会丢分。
5.4 常考易错点速查表
| 易错点 | 正确理解 | 常见错误 |
|---|---|---|
| PC自增时机 | 取指周期结束时PC已指向下一条指令 | 以为PC在执行周期才自增 |
| 相对寻址偏移量 | 相对于下一条指令地址 | 相对于当前指令地址 |
| 间址周期访存次数 | 一次间址访存一次,二次间址访存两次 | 混淆间址次数和访存次数 |
| 扩展操作码 | 从地址码多的指令开始分配 | 从地址码少的开始分配 |
| 流水线总周期 | 深度 + 指令数 - 1 + 停顿 | 忘记加流水线深度 |
| 微指令下地址 | 顺序执行时指向下一条微指令 | 以为总是跳到微程序入口 |
| 寄存器可见性 | PC、PSW用户可见,IR、MAR用户不可见 | 把IR当成用户可见 |
| 总线冲突 | 同一周期只能一个部件输出 | 多个源部件同时输出 |
这张表里的每一条都是我做题时实际错过的,尤其是PC自增时机和相对寻址偏移量,在选择题里反复出现。建议考前把这张表过一遍,比翻书快。
6. 复习资料与工具使用心得
复习408计组,王道复习指导是主力,但光看王道不够。我的搭配是:王道打基础,唐朔飞教材补细节,真题练手感。王道的好处是知识点覆盖全、题目贴近408风格,但有些原理讲得比较简略,比如微程序控制器的下地址字段、流水线的转发逻辑,唐朔飞书里讲得更透。
思维导图方面,我建议自己画,不要直接用别人做好的。自己画的过程就是梳理逻辑的过程。我画指令系统时,以“指令格式”为根,分出“操作码”“地址码”“寻址方式”“指令类型”四个分支,每个分支再展开。画CPU时,以“数据通路”为根,分出“寄存器”“ALU”“控制器”“总线”四个分支。画完之后,做题时遇到哪个知识点模糊,就回到导图上定位,比翻书快很多。
湖科大教书匠的计算机网络课确实适合408,但计组部分他讲得不多。计组如果想看视频,我推荐哈工大的MOOC或者王道自己的视频课。视频的作用是帮你过一遍流程,但真正理解还是要靠自己画图、做题、调试。
最后说一句关于做笔记的方法:不要抄书。我在第一轮复习时抄了满满一本笔记,结果第二轮发现全是书上的原话,没有自己的理解。第二轮我改成“问题驱动”——每学完一章,给自己提三个问题,比如“为什么需要间址周期”“微程序和硬布线怎么选”“流水线冲突怎么解决”,然后不看书画出答案。画不出来的地方就是薄弱点,再回去补。这个方法比抄书效率高得多。
如果这篇文章对你有帮助,那说明我把这两章的核心逻辑讲清楚了。指令系统和CPU是计组里最像“系统”的部分,学的时候不要孤立地背知识点,多问“这个部件为什么存在”“这个设计解决了什么问题”,慢慢就能把整台机器在脑子里跑起来了。