
指令系统和中央处理器这两章几乎每个考408的人都会在这里卡上一段时间。指令系统是软硬件之间的接口层CPU则是把这个接口真正跑起来的执行者这两块内容串起来就是一句话指令怎么被编码、怎么被找到、怎么被一步步执行完。说它重要不只是因为分值高而是它把前面存储系统、后面总线输入输出全部粘在了一起——你如果这里没吃透做真题时会频繁出现公式背了但不知道往哪代的尴尬。这篇笔记整理的是我在啃王道和教材、刷真题过程中反复回看的核心内容包含指令格式与扩展操作码的推演、寻址方式的有效地址计算、CISC与RISC的取舍、CPU数据通路与微操作、硬布线与微程序控制器对比、流水线性能计算与三类冒险以及异常中断机制。适合正在第一轮打基础、也适合二轮想查漏补缺的同学基础一般也能跟下来因为每个计算我都把过程摊开写。1. 为什么指令系统和CPU是计组的分水岭刚入门的时候很多人会把指令系统当成背概念的章节寻址方式列一遍、CISC和RISC对比记一下就翻过去了。但真正做题才发现这一章和CPU是连体的——寻址方式决定了数据通路要有什么部件指令格式决定了控制器要产生哪些微操作信号。把它们拆开看你会觉得两章都是零散知识点合起来看它其实是一条完整的线指令编码 → 取指 → 译码 → 取数 → 执行 → 写回。1.1 两个章节在整个408体系中的位置408的组成原理大致可以分成五大块数据表示与运算、存储系统、指令系统、中央处理器、总线与IO。指令系统是承上启下的那一块——上面接的是存储器的编址和访问下面接的是控制器如何解释指令。中央处理器则是把指令系统真正落地执行的部分它回答的是一条指令从内存里被取出来到结果写回寄存器中间到底发生了什么。我自己的复习感受是数据表示和存储系统靠的是记忆加少量计算而指令系统和CPU靠的是理解加推演。扩展操作码你光背结论没用换个位宽就懵流水线的加速比你只记公式遇到考虑流水线建立时间有暂停周期的变体就崩。所以这两章的核心不是背而是把机制想通想通之后你会发现公式其实都能自己推出来。从真题分布看指令系统常考指令格式分析、寻址方式有效地址与访存次数、扩展操作码计算、相对寻址的目标地址计算CPU部分常考指令周期各阶段的数据流、微操作序列、微指令格式与编码、微地址形成方式、流水线吞吐率与加速比、数据冒险与转发。这些点单看都不难难的是它们经常以综合题的形式混在一起一道大题里同时出现流水线和数据通路。1.2 复习顺序与时间分配的实际经验我给的建议顺序是先啃指令格式和寻址方式因为这是读懂一条指令的前提再进CPU的寄存器组和数据通路因为你要知道数据在哪几个部件之间流动然后是控制器硬布线和微程序两条线都要过最后是流水线和异常中断这两块是拔高的综合考点。时间上一轮的时候这两章我大概花了将近两周其中指令系统三天CPU结构和数据通路四天控制器三天流水线和异常中断三到四天。二轮不重新啃只做两件事把扩展操作码和流水线的计算题集中刷一遍再把易错点做成小卡片。三轮就靠真题查漏。有一点要提醒别在指令系统里陷太深去抠冷门寻址方式408的考查范围是稳定的堆栈寻址、基址变址结合这些掌握原理即可重点永远是立即、直接、间接、寄存器、寄存器间接、相对、基址、变址这几种以及它们各自的有效地址怎么算、访问几次内存。2. 指令系统从格式到寻址的完整拆解指令系统这一章最忌讳的就是名词堆砌式记忆。真正有效的方式是围绕三个问题展开一条指令长什么样格式、操作数在哪寻址、一共有哪些指令类型与风格。把这三个问题答清楚这一章就成型了。2.1 指令格式与扩展操作码的推演方法一条指令从结构上分为操作码字段和地址码字段。操作码告诉CPU做什么地址码告诉CPU对谁做。按地址码个数分常见有零地址、一地址、二地址、三地址指令。地址码越多的指令能表达的操作越复杂但指令字长也越大。这里最关键的一个概念是指令字长与机器字长的关系。指令字长可以等于机器字长也可以是其整数倍或一半408里经常用指令字长16位、地址码4位这种设定来出计算题。理解这一点是为了后面算操作码空间。扩展操作码的核心逻辑只有一句话短操作码不能是长操作码的前缀。换句话说如果你用4位操作码表示三地址指令那么已经用作三地址指令的那些4位编码就不能再被拿来当作更长操作码的前缀去扩展别的指令。我把最经典的题型拆开讲。设指令字长16位每个地址码4位采用扩展操作码指令分三地址、二地址、一地址、零地址四种。三地址指令操作码4位 3个地址各4位 16位刚好占满。4位操作码一共有 2^4 16 个编码。二地址指令操作码要扩展到8位4位基础 4位扩展地址占 2×4 8 位总共16位。一地址指令操作码12位 地址4位 16位。零地址指令操作码16位。现在假设三地址指令需要 n3 条二地址 n2 条一地址 n1 条零地址 n0 条。推演过程是这样三地址指令占用 n3 个4位编码。为了让二地址有扩展空间三地址最多用掉15个编码必须留至少一个通常是全1的1111作为扩展标志。所以三地址指令条数 n3 ≤ 15。剩下的扩展空间是 (16 − n3) 个4位前缀每个前缀再配4位一共能提供 (16 − n3) × 16 个二地址编码。二地址用掉 n2 条后剩余 (16 − n3) × 16 − n2 个编码可以继续向一地址扩展每个再配4位所以一地址容量是 [(16 − n3) × 16 − n2] × 16。以此类推到零地址。举个具体数三地址指令14条问一地址指令最多多少条不考虑零地址。三地址用掉14个编码剩2个前缀给二地址。如果二地址取0条那么一地址 2 × 16 32 条。如果题目还要求保留零地址指令空间那就要在最后留一个编码一地址最多31条。我踩过的坑是忘记必须留一个编码用于扩展这条规则直接按满16算结果全错。还有一个常见坑是位宽不是4位这种整数关系比如操作码3位、地址码5位这时候要老老实实按二进制位去凑别套公式。注意扩展操作码题的通用做法是先确定每级扩展留一个编码再逐层乘以每级能提供的地址位数对应的编码数千万别背死公式一定要按题目给的位宽重新推。2.2 寻址方式的分类与有效地址计算寻址方式回答的是操作数的有效地址从哪来。我把它分成两大类来记操作数在主存里的和操作数在寄存器里的。先说主存类立即寻址操作数直接写在指令里取指令的时候就顺带取到了不需要再访存。访问内存次数为0这里指取操作数。它的缺点是操作数位数受限。直接寻址指令的地址字段直接给出有效地址EA。取操作数访存1次。间接寻址指令给出的是地址的地址EA M(A)。一次间接访存2次一次取地址、一次取数两次间接更多。它的好处是扩大寻址范围。相对寻址EA (PC) A。这里的PC是当前指令的地址加上指令长度也就是下一条指令的地址。这一点极其容易错很多人直接用当前指令地址去加。基址寻址EA (基址寄存器) A基址寄存器内容由操作系统确定主要用于多道程序重定位。变址寻址EA (变址寄存器) A变址寄存器的内容在程序执行中可变主要用于数组和循环处理。再说寄存器类寄存器寻址操作数就在寄存器里不需要访存速度快。寄存器间接寻址寄存器里存的是操作数的地址EA (R)访存1次。我把访存次数整理成表方便快速对照寻址方式有效地址EA取操作数访存次数立即寻址无操作数在指令中0直接寻址A1一次间接寻址M(A)2寄存器寻址无操作数在寄存器0寄存器间接寻址(R)1相对寻址(PC) A1基址寻址(BR) A1变址寻址(IX) A1相对寻址的计算题一定要小心PC指向下一条指令。举个例子某指令存放在地址2000处指令字长2字节相对寻址的位移量A为-3补码表示那么取完这条指令后PC 2002目标地址 2002 (-3) 1999。如果你用2000去加就差了2。2.3 指令类型与CISC、RISC的取舍从功能上指令可以分成几大类数据传送类MOV、LOAD、STORE、算术逻辑运算类ADD、SUB、AND、移位操作类、转移控制类跳转、调用、返回、输入输出类等。408不要求记住具体某台机器的指令集但要求你理解这些指令在数据通路里大概会做什么。CISC复杂指令集和RISC精简指令集的对比是必考内容我用一张表总结对比项CISCRISC指令数量多几百条少几十到一百多条指令长度变长定长寻址方式多且复杂少且简单访存指令运算指令可直接访存只有LOAD/STORE访存通用寄存器数量较少较多控制器实现多用微程序多用硬布线程序编译依赖编译器优化少依赖编译器优化多指令周期差别大长短不一多为单周期便于流水这里有一个容易被忽略的因果关系RISC指令定长且简单所以更容易做流水线而流水线要求每个阶段时间尽量均衡CISC指令长短不一就很吃亏。这一条把指令系统和后面CPU流水线串起来了是理解层面的关键。另外补充一个常考细节RISC处理器中只有LOAD/STORE指令能访问内存算术运算只能在寄存器之间进行。这个约束叫做load-store结构它直接决定了数据通路里访存部件和运算部件的分工也是后面分析数据冒险的基础。3. 中央处理器数据通路与控制器CPU这一章的核心画面是一堆寄存器、一个ALU、一个控制器通过内部总线连起来控制器按时序发出微操作信号让数据在部件之间流动把指令执行完。你只要能把这个画面在脑子里动画化很多题目都能推出来。3.1 CPU功能与寄存器组的划分CPU的两大功能是运算和控制对应运算器和控制器两个部件。运算器主要包括ALU算术逻辑单元、累加寄存器ACC、状态字寄存器PSW、通用寄存器组、移位器。ALU负责算PSW记录运算结果的状态进位、溢出、零、符号这些标志位会被条件转移指令用到。控制器主要包括程序计数器PC、指令寄存器IR、指令译码器、时序系统、微操作信号发生器。PC存放下一条指令的地址IR存放当前正在执行的指令译码器负责翻译操作码。寄存器还有一个非常爱考的划分方式用户可见和用户不可见。用户可见通用寄存器、PSW、PC。程序可以通过指令去读写。用户不可见MAR地址寄存器、MDR数据寄存器、IR、各类暂存器。这些是CPU内部为实现指令而设的程序看不见。我之前总记混MAR和MDR的归属后来想通了它们是CPU和主存之间的中转站。CPU要访存先把地址放MAR再通过数据总线把数据读到MDR。所以它们虽然在CPU内部但不算用户可见寄存器。3.2 指令周期与四个阶段的数据流指令周期是指CPU取出一条指令并执行完所需的时间。它通常被划分成四个阶段取指周期、间址周期、执行周期、中断周期。注意间址周期只在采用间接寻址时才出现中断周期只在响应中断时出现。取指周期的数据流是必须背熟的一组微操作(PC) → MAR把下一条指令地址送到地址寄存器。M(MAR) → MDR从主存读出指令内容。MDR → IR指令送入指令寄存器。(PC) 1 → PCPC指向下一条指令这里1表示加一个指令字长对应的单位。这四步几乎每道数据通路题都会涉及。你把它记牢后面分析间址周期就轻松了。间址周期的数据流取操作数地址。(IR中的地址字段) → MAR。M(MAR) → MDR读出有效地址。MDR → IR的地址字段或送入暂存器。执行周期没有统一的数据流取决于具体指令。如果是加法指令 (R0)(R1) → R0大致是R0 → ALU的一端R1 → ALU的另一端ALU做加法结果写回R0。如果是访存指令就还要走MAR、MDR、主存这一趟。中断周期的数据流配合中断隐指令把当前PC断点保存到主存或栈中。把中断服务程序的入口地址送入PC。这里要记住中断隐指令这个概念它不是程序里的指令而是硬件在响应中断时自动执行的一系列操作包括关中断、保存断点、引出中断服务程序。3.3 数据通路与微操作序列的推导数据通路就是数据在部件之间传输的路径。做题时题目通常给你一个数据通路图让你为某条指令写出完整的微操作序列。我的方法是三步走先确定这条指令需要取哪些操作数、放到哪。再确定这些操作数要经过哪些部件、走哪条总线。最后按节拍把每个微操作写出来确保同一节拍内不会有两个数据同时占用同一条总线。举个加法指令的例子假设数据通路是单总线结构一条总线连接所有寄存器ALU有两个输入寄存器A和B输出再接回总线。取指周期PC → MARM(MAR) → MDRMDR → IRPC 1 → PC执行周期ADD A, R1含义是 (A) (R1) → AA → 总线 → ALU的A端暂存R1 → 总线 → ALU的B端暂存ALU计算结果 → 总线 → A更新PSW你看单总线结构下同一个节拍只能有一个数据占用总线所以A和R1要分两个节拍送进ALU。这就是为什么单总线CPU的指令执行要多个节拍。理解这一点你就明白为什么会有多总线结构——多一条总线就能并行传两个数据缩短指令周期。提示单总线、多总线结构的区别在于同一节拍能传输的数据个数。做题时如果发现某两个微操作要同时把不同数据送到同一总线就说明必须拆到两个节拍这是判断微操作能否合并的关键依据。3.4 硬布线控制器与微程序控制器控制器怎么产生微操作信号有两条实现路径硬布线和微程序。硬布线控制器用组合逻辑电路直接产生微操作信号。它的输入是操作码、时序信号、标志位输出是各个微操作控制信号。优点是速度快缺点是设计复杂、修改困难。RISC机器多用它。微程序控制器把每条机器指令的执行过程转换成一段微程序存在控制存储器CM里。执行指令时从CM里依次读出微指令每条微指令产生一批微操作信号。它的优点是设计规整、易修改缺点是速度慢一些。微程序这块概念密集我拎几个关键点微命令控制器发出的、控制部件具体动作的信号。微操作微命令对应的实际操作。微指令一个节拍内能完成的一组微命令的集合。微程序完成一条机器指令的微指令序列。控制存储器CM存放微程序的只读存储器位于CPU内部。微指令的编码方式有三种编码方式特点优缺点直接编码每一位对应一个微命令速度快微指令字长位空间浪费字段直接编码互斥的微命令放同一字段编码缩短字长需要译码速度稍慢字段间接编码字段含义由另一字段解释进一步缩短字长译码更复杂字段直接编码要遵守两条规则互斥的微命令才能放在同一个字段因为同一时刻一个字段只能有一个有效值每个字段要留出一个编码表示不发出任何微命令。微地址的形成方式也有两种要区分断定方式由微指令的下地址字段直接指定下一条微指令地址和计数器方式微地址由计数器顺序加一产生遇到转移再修改。断定方式灵活计数器方式适合顺序执行。我自己记这两块的方法是抓住谁快谁慢、谁简单谁复杂这条主线硬布线快但难改微程序慢但规整直接编码快但浪费字段编码省但需译码。理解了这层权衡选择题基本不会选错。4. 流水线从理论到做题的完整打通流水线是CPU这一章的综合拔高点。它把指令执行拆成多个阶段让不同指令的不同阶段在时间上重叠从而提高吞吐率。理解流水线的关键是时空图你把时空图画出来吞吐率、加速比、效率都能从上面对应关系里读出来。4.1 流水线性能指标的计算方法三个核心指标吞吐率、加速比、效率。吞吐率TP单位时间内完成的指令条数。若流水线有k个阶段每个阶段耗时一个时钟周期Δt执行n条指令TP n / ((k n − 1) × Δt)当n趋于无穷时TP_max 1 / Δt。也就是说流水线充满后每个时钟周期出一条指令。加速比S不用流水线的顺序执行时间比上流水线执行时间。顺序执行时间 n × k × Δt 流水线执行时间 (k n − 1) × Δt S (n × k) / (k n − 1)效率E流水线中有效工作时间占总时间的比例。E S / k。做题的时候最需要小心的是流水线建立时间和可能存在的不等长阶段。比如某条指令要5个阶段各阶段时间分别是4ns、3ns、5ns、2ns、4ns那么流水线的时钟周期要取最长阶段5ns因为所有阶段必须同步。这时候吞吐率分母用的是5ns而不是各阶段时间之和18ns。再看一个常见变体题目给了流水线的时钟周期但某几类指令需要额外暂停周期比如访存冲突导致插一个气泡那么有效指令数不变但总时间要加上暂停周期数。所以我的做法是先把执行总时间的表达式老老实实列出来再套公式别直接背。4.2 三类冒险与解决手段流水线并非理想指令之间会互相干扰这就是冒险。分三类结构冒险资源冲突两条指令在同一时刻竞争同一个硬件资源。经典的例子是指令流水线要取指同时数据流水线要访存如果只有一个存储器就冲突了。解决办法是把指令存储器和数据存储器分开哈佛结构思想或者加停顿。数据冒险后面的指令需要用到前面指令还没写回的结果。数据冒险细分为RAW写后读后一条指令读前一条还没写入的寄存器。WAR读后写后一条指令写前一条还在读的寄存器。WAW写后写两条指令写同一寄存器。在按序流水线中实际只有RAW才是真正的冒险。WAR和WAW只有在乱序流水线里才会出现。这一点很多同学会记错一定要分清。解决数据冒险的手段转发/旁路不等结果写回寄存器直接把ALU的输出送到下一