ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

计算机组成原理指令系统:扩展操作码、寻址方式与CISC/RISC

计算机组成原理指令系统:扩展操作码、寻址方式与CISC/RISC 每年九月开始啃王道单科册第四章指令系统总会卡住一批人。前面存储系统刚把Cache、虚拟存储、页表算明白翻到这一章突然冒出来一堆零地址、一地址、扩展操作码、相对寻址看书的时候每个字都认识合上书那道操作码编码题就是推不出来。我带过几届备考的同学也见过不少软件方向、跨考的朋友在计算机组成原理这一章反复回炉问题基本都不在智力上而是没搞清指令系统在整个课程结构里的位置——它是软件和硬件之间那份“合同”后面流水线、控制器、总线全都要拿它当输入。这篇文章想做的事很直接把2022年考研大纲里第四章的知识点拆到能做题的颗粒度把扩展操作码、寻址方式、CISC与RISC这些必考点讲成可以直接抄的推演模板顺便把我踩过的坑和几次复盘的经验一起摊开。不管你是零基础跨考还是科班出身但被第三章虐完信心受损都能顺着往下走。1. 这一章在考研卷面上到底占多少分量1.1 学软件的为什么必须啃这一章我最早也觉得奇怪写代码的人为什么要管操作码字段几位、地址码怎么排。后来自己写过一个简易的栈式虚拟机再回头看这章很多问题一下就通了。你写a b c编译器最终要落成一串指令而指令系统决定了这串指令长什么样、一条能塞几个地址、操作数从哪里取。处理器能执行的操作种类、寻址范围、寄存器数量全都写在指令系统的定义里。换句话说指令系统是硬件向软件暴露的接口集合懂了它你才明白为什么有些循环编译器能优化掉、为什么数组访问常常配合变址、为什么函数调用要压栈返回地址。2022年考研计算机学科专业基础综合里计算机组成原理占的分值稳定而指令系统在选择题和综合题里都有落点。它不像浮点数运算那样一道大题十几分但它是一个“接口章节”浮点运算部件怎么读操作数、CPU怎么根据操作码发出控制信号、流水线怎么判断两条指令相关全都建立在这一章的结论上。软件方向的同学如果这章含糊第五章流水线的数据相关、结构相关就只能死记结论到考场上一变形就不会做。我更愿意把这章当成“词汇课”。指令、操作码、地址码、寻址方式、有效地址这些词在后面每一章都会重复出现。第一遍学的时候把每个词的物理含义抠清楚第二遍、第三遍复习几乎不用再重新理解只看结论和例题就行。这也是为什么我建议零基础的人不要跳过第三节和第四节的推导哪怕多花两个小时后面省下来的时间远不止两个小时。1.2 题型分布与投入产出比从历年真题和主流习题册的风格看指令系统主要有三类考查方式。第一类是概念选择考指令格式的组成、某种寻址方式的有效地址怎么算、CISC和RISC的特征对比这类题分值小但数量多属于必须拿满的部分。第二类是计算型选择或填空集中在一地址、二地址、三地址指令条数扩展操作码能扩展出多少条指令相对寻址的转移目标地址。第三类是综合题里的一个小问比如给出指令格式让你写某条指令的二进制编码或者在流水线题里问某条指令有几次访存。投入产出比最高的是扩展操作码。它看起来吓人其实是个固定套路掌握一次就能一直用。其次是寻址方式的有效地址计算尤其是相对寻址里PC到底取哪一次的值这是选择题的高频陷阱。CISC和RISC的对比考的是记忆做一张表反复看即可不用花太多推导时间。提醒别在这一章一开始就死背指令种类。先把操作码和地址码的结构关系弄明白指令类型那部分是一眼扫过的内容顺序反了会很痛苦。我自己的复习顺序是先看指令格式和扩展操作码再攻寻址方式最后串指令类型和CISC、RISC。这个顺序和大部分教材的章节顺序一致原因是扩展操作码的推导会自然带出地址码字段的概念而寻址方式又建立在“指令里给的地址码是什么”这个前提上一环扣一环。2. 指令格式与扩展操作码把计算题做成填空题2.1 地址码字段数量的本质是什么一条指令最基本的组成是操作码加地址码。操作码告诉你做什么地址码告诉你操作数在哪、结果放哪。所谓几地址指令字面意思就是指令里有几个地址码字段。零地址指令没有地址字段它的操作数位置是隐含约定的典型代表是堆栈类指令和空操作、停机这类命令。一地址指令只有一个地址字段常见于自增、取反、压栈这类只需要一个操作数的场景另一个操作数隐含在累加器里。二地址指令有两个地址字段通常是“目的兼源源”的格式做加法时把结果写回第一个地址。三地址指令有三个字段目的和两个源分开表达能力最强指令条数也最多。四地址指令在教材里会出现第四个地址字段放的是下一条指令的地址方便程序跳转。现代机器基本不用因为PC已经能自动顺序取下一条没必要浪费字段。理解这一点很重要地址码个数不是越多越好而是要在指令长度和表达能力之间做权衡。指令字长固定时地址字段越多每个字段能分到的位数越少寻址范围就越小。这里有个很多人第一次学会绕进去的点地址码位数和寻址范围是二的四次方关系。比如单个地址字段有4位能表示的地址编号是16个有16位就是64K个编址单元。主存按字节编址还是按字编址会直接改变同一个字段能覆盖的存储空间大小。做题时先把编址单位确认清楚这一步错了后面全错。2.2 扩展操作码的推演模板定长操作码的意思是所有指令的操作码长度一样。它译码简单硬件实现容易缺点是编码空间利用率低指令条数一旦接近上限就没办法再加。变长操作码用扩展技术解决这个矛盾让短操作码留给地址字段多的指令长操作码留给地址字段少的指令牺牲一部分编码空间换来灵活性。扩展操作码的题目有一个稳定的推演流程。我把它总结成三步。第一步确定操作码的最短长度也就是地址字段最多那种指令的操作码位数。第二步算出这一层总共有多少种编码、实际用掉多少、剩下多少用来向上扩展。第三步每往上一层地址字段减少一个操作码就增加一个地址字段的位数把上一层剩下的扩展标志乘以这一层新增位的编码数就是这一层理论上能容纳的最大指令条数。拿王道上一道经典题走一遍。设指令字长16位地址码字段4位。三地址指令的操作码是16减12等于4位共16种编码。假设设计15条三地址指令剩下1种编码通常是全0作为扩展标志。到了二地址指令地址字段变成两个共8位操作码变成8位其中高4位必须等于那个扩展标志低4位有16种组合所以二地址指令理论上最多16条。如果题目说设计了12条那还剩4种扩展标志。再到一地址指令地址字段4位操作码12位可用的高8位是4种扩展标志低4位16种组合最多64条。最后到零地址指令操作码占满16位可用高12位是上一层剩下的扩展标志数乘以16得到零地址指令的上限。我把这个过程写成模板做题时直接套三地址层操作码位数 指令字长 - 3 × 地址码位数容量 2 的该位数次方每下一层操作码位数增加一个地址码位数容量 上层剩余标志数 × 2 的地址码位数次方剩余标志数 该层容量 - 已用指令条数这个模板几乎能应付所有变体。有的题会反过来给零地址指令条数让你求某个中间层用了几条本质就是同一套方程解未知数把每一层的剩余标志当成乘法链上的因子即可。注意扩展标志的分配顺序必须从短操作码那端开始。如果你把三地址指令用掉的编码随便乱选二地址指令的高位就对不上后面整条链会崩。标准做法是固定用全0或全1作为扩展标志教材和真题基本都这么约定。2.3 指令字长、机器字长、存储字长的三角关系这三个词经常被混着用但含义不一样。指令字长是一条指令占的二进制位数。机器字长是CPU一次能处理的二进制位数通常等于通用寄存器的位数和ALU的位数。存储字长是一个存储单元存放的二进制位数。三者不一定相等。一台机器可能机器字长32位指令字长16位或32位存储字长8位。这个区分直接影响访存次数和取指次数。指令字长如果大于存储字长一条指令要分多次访存才能取完。比如指令字长32位、存储字长16位取指阶段需要访问两次主存。题目里出现“每次访存取一个字”这种表述时一定要先弄清字长是多少。我见过不少人在相对寻址计算里把PC增量算错根子就在于没确认指令占几个存储字取指后PC到底加了几。还有一个容易忽略的点定长指令和变长指令对PC增量的影响不同。定长指令每条长度一样PC固定加一个常数变长指令每条长度不同PC要加当前指令的实际长度。相对寻址的偏移量是相对“取指之后PC的值”算的所以当前指令长度直接进入计算。这一点下一节会专门展开。3. 九种寻址方式用“操作数在哪”统一记忆3.1 按操作数存放位置分三类寻址方式名字多但分类标准只有一个操作数或者操作数的有效地址放在哪里。我把它归成三类。第一类操作数直接出现在指令里或寄存器里不访问主存就能拿到包括立即寻址和寄存器寻址。第二类指令里给的是主存地址或它的间接地址需要访问主存才能拿到操作数包括直接寻址、间接寻址、寄存器间接寻址。第三类指令里的地址字段不是完整地址而是一个偏移量要和某个基准值相加才形成有效地址包括相对寻址、基址寻址、变址寻址。堆栈寻址可以单独放一类它的地址来自堆栈指针属于隐含寻址。按这个框架记每个名字的意义就清楚了。立即寻址的“立即”指的是操作数紧跟操作码取指时顺带就取进来了。直接寻址的地址码就是有效地址不再加工。间接寻址要再读一次主存因为地址码指向的单元里存着的才是有效地址。寄存器间接寻址把那次访问换成寄存器速度快。相对寻址的偏移量是相对的程序整体搬移后指令仍能正确跳转这就是位置无关代码的由来。基址寻址面向系统由操作系统设定基址用户程序不能随便改。变址寻址面向用户常用于数组和循环偏移量是变址寄存器的内容指令里的地址码作为形式地址。访存次数是选择题常考点我把常见寻址方式的取操作数访存次数整理成下表。注意这里只算取操作数本身取指令那一次不计入。| 寻址方式 | 有效地址 | 取操作数访存次数 | | 立即寻址 | 无操作数在指令中 | 0 | | 寄存器寻址 | 寄存器编号 | 0 | | 直接寻址 | 地址码本身 | 1 | | 间接寻址 | 地址码所指单元的内容 | 2一次间接 | | 寄存器间接寻址 | 寄存器的内容 | 1 | | 相对寻址 | PC 加偏移量 | 1 | | 基址寻址 | 基址寄存器加偏移量 | 1 | | 变址寻址 | 变址寄存器加偏移量 | 1 | | 堆栈寻址 | 栈顶指针 | 1 |间接寻址如果做多次间接访存次数继续翻倍每多一级间接就多一次访存。做这类题时画一棵“指针树”根在指令里叶子才是操作数指针链有几条边访存就是几次思路最不容易乱。3.2 相对寻址的偏移量和PC取值相对寻址是这章最容易翻车的地方问题几乎都出在PC取哪一次的值。规则只有一句话偏移量是相对“取出当前这条指令之后”的PC值计算的也就是PC要先自增一条指令的长度。很多人习惯用当前指令地址去加偏移量结果差了一个指令长度选择题直接掉坑。具体步骤是这样的。第一确认主存编址单位按字节还是按字。第二确认当前指令占几个编址单元比如按字节编址、指令字长16位那就是2字节。第三取指后PC等于当前指令地址加上指令长度。第四把偏移量当补码处理加上这个PC值得到转移目标的有效地址。看一个例子。某机按字节编址转移指令存放在地址2000H处指令字长2字节偏移量字段的值是05H为正数。取指后PC等于2002H目标地址等于2002H加0005H结果是2007H。如果偏移量字段是F6H二进制是11110110最高位为1说明是负数取补码转换为十进制是负10。目标地址等于2002H减000AH也就是1FF8H。这里的减法用十六进制算2002H减000AH从低字节借位得到1FF8H。提示偏移量是补码这一点要牢牢记住。题目里给十六进制偏移量时先看最高位是0还是11就是负数别当成无符号数直接加。我第一年就是在这个地方翻的车一道选择题白送分没了。还有一种变体考“转移目标地址反推偏移量”做法一样把目标地址减去取指后的PC得到的结果转成补码形式写进偏移量字段。要注意指令长度、编址单位这些边界条件题目一旦改成按字编址、指令字长32位PC增量就变成1而不是4这类细节每年都有人栽。3.3 基址寻址和变址寻址的分工差异这两种寻址方式长得太像都是“寄存器加偏移量”很多人靠死记区分考场上容易混。我想给一个能彻底分开的角度看谁动、谁不动以及谁提供服务。基址寻址里基址寄存器的内容由操作系统或管理程序决定在程序运行期间基本不变指令里的地址码是偏移量。它的主要用途是把用户程序的逻辑地址空间整体映射到主存某段物理区域实现程序的浮动装配。用户程序无权修改基址寄存器这是权限层面的设计。变址寻址里变址寄存器的内容由用户程序控制典型场景是循环中不断递增指令里的地址码作为数组首地址或形式地址保持不动。每次循环变址寄存器加一个元素长度就能顺序访问数组元素。这个“寄存器变、形式地址不变”的特征是判断关键。换个说法基址寻址解决的是“程序放哪里”的问题变址寻址解决的是“数组第几个元素”的问题。前者面向系统后者面向用户。做选择题时看到“程序浮动”“逻辑地址到物理地址转换”就选基址看到“数组遍历”“循环控制”就选变址。这是一条几乎不用推导的快速判断路径。堆栈寻址单独提一句。硬堆栈用寄存器组实现软堆栈在主存里划一块区域靠栈指针SP指示栈顶。压栈时先修改SP再存数还是先存数再修改SP不同机器约定不同做题时看清楚题目给的是哪种。堆栈寻址的操作数地址隐含在SP里指令中不需要地址字段所以它常常和零地址指令一起出现。4. 指令类型、CISC与RISC设计取舍背后的逻辑4.1 常见指令类型怎么归类指令按功能大致分成几类数据传送、算术逻辑运算、移位操作、转移与控制、输入输出、字符串处理、系统控制。数据传送类负责在寄存器和主存、寄存器和寄存器之间搬数据MOV、LOAD、STORE、PUSH、POP都属于这一类。算术逻辑类包括加减乘除和与或非异或比较指令通常也算在这一类。移位操作有逻辑左移右移、算术左移右移、循环移位算术右移要保留符号位这是和逻辑右移的本质区别。转移类包括无条件转移、条件转移、调用和返回条件转移依赖标志寄存器里的状态位。记忆时不用一条条背抓住两个维度就够了这条指令改不改变数据、要不要访问主存。算术逻辑和移位只动寄存器或标志位数据传送只搬数据不改值转移指令改变的是PC。把每个具体指令往这两个维度上一放它的行为就清楚了。考试里很少直接问你某条指令属于哪一类但会在流水线题里问某条指令执行时需要几个周期、有没有访存这时候分类就是推理的起点。还有一类叫复杂指令比如字符串比较、多项式求值这类在CISC里常见RISC里基本被拆成多条简单指令的组合。理解这一点CISC和RISC的很多差异就顺理成章了。4.2 CISC和RISC的对照与考点CISC和RISC的对比是必考记忆点但光背特征容易记混理解设计目标之后就好办了。CISC的目标是用一条复杂指令替换一串简单指令缩小程序体积方便编译器生成代码代价是控制器复杂、指令长度不定、流水线难做。RISC的目标是让每条指令都简单、定长、能在一个周期内完成靠流水线提高吞吐率代价是同样的功能需要更多指令对编译器优化要求高。我把常考对比项整理成表背之前先理解每一行背后的原因。| 比较项 | CISC | RISC | | 指令数量 | 多几百条 | 少几十到一百多条 | | 指令长度 | 变长 | 定长 | | 寻址方式 | 多 | 少 | | 访存指令 | 普通指令也能访存 | 只有LOAD和STORE访存 | | 通用寄存器 | 少 | 多 | | 控制器实现 | 多为微程序控制 | 多为硬布线控制 | | 流水线 | 较难效率受限 | 容易效率高 | | 程序体积 | 较小 | 较大 | | 编译优化 | 相对容易 | 对编译器要求高 |“只有LOAD和STORE访存”这一条要重点理解。它意味着算术逻辑指令的操作数必须先在寄存器里不能直接对主存做加法。这个约定让指令长度统一、执行周期可预测流水线才不会因为某条指令要多次访存而停顿。这也是RISC能高效流水的原因之一。考点上题目常给一段描述让你判断是CISC还是RISC关键词包括“指令定长”“只有取数存数访存”“通用寄存器多”“硬布线控制”看到这些基本锁定RISC。反过来出现“指令变长”“大量寻址方式”“微程序控制”就是CISC。另一种考法是问RISC是否一定比CISC快答案是未必取决于具体负载和实现但RISC在流水线效率和功耗控制上通常更有优势。5. 真题复盘与踩坑清单5.1 扩展操作码的完整推演过程我把前面那道扩展操作码题完整走一遍顺便把我当年做错的地方标出来。题目设指令字长16位地址码4位采用扩展操作码三地址指令15条二地址指令12条一地址指令62条问零地址指令最多多少条。第一步算三地址层。操作码等于16减3乘4等于4位容量是2的4次方等于16种。用了15条剩1种作为扩展标志。第二步算二地址层。操作码变成8位高4位是上一层剩下的扩展标志只有1种低4位有16种组合所以容量是1乘16等于16条。题目用了12条剩4种扩展标志。第三步算一地址层。操作码变成12位可用扩展标志是4种每种后面还有4位地址码位置所以容量是4乘16等于64条。用了62条剩2种扩展标志。第四步算零地址层。操作码占满16位可用扩展标志是2种每种后面还有4位所以零地址指令最多是2乘16等于32条。答案就是32条。整个过程没有复杂运算关键是每一步的“剩余标志”要一路带下去不能中途重新数。我当年第一次做的时候在二地址层直接写16减12等于4没错但到一地址层忘了乘16直接拿4去算结果差了一个数量级。这个错误本质是没理解“每个扩展标志下面还挂着一整片编码空间”把它当成简单的减法了。经验做扩展操作码题时在草稿纸上画一棵树。第一层16个叶子用掉15个剩下的那个节点往下长出16个孩子这就是二地址层。用掉12个剩下4个节点各再长16个孩子就是一地址层。画完树数叶子数就行了比纯代数更不容易错。还有一种反向题给零地址指令条数问二地址指令最多几条。解法是把乘法链倒过来用零地址条数除以每一层的编码宽度逐层往上收。要注意整除和余数的处理题目一般会设计成整数遇到除不尽就说明前面某层的最多用数要调整。5.2 常见错误速查与排查思路我把这一章高频错误整理成一张速查表考前扫一遍比重新看一遍书有效。| 现象 | 可能原因 | 排查方法 | | 相对寻址目标地址差一个指令长度 | PC用了取指前的值 | 确认取指后PC要加指令长度 | | 扩展操作码结果偏小 | 某层剩余标志没往下乘 | 画扩展树逐层数叶子 | | 间接寻址访存次数算少 | 漏了取操作数那一次访存 | 按指针链边数计算 | | 基址变址判断错 | 没区分面向系统还是面向用户 | 看寄存器内容由谁修改 | | 指令字长和存储字长混淆 | 取指次数算错 | 先确认编址单位和字长 | | CISC、RISC判断错 | 只背特征没理解设计目标 | 抓住定长与访存约束两条 | | 地址码范围算错 | 忘记按编址单位换算 | 位数确定编号数再乘编址单位 |排查思路的核心是把每一步的中间量写出来。很多人做题喜欢一步到位直接写答案错了之后不知道哪一步出的问题。我习惯在草稿上把“操作码位数、本层容量、已用条数、剩余标志”四个量列成一行一层一行做完从上往下核对哪一行对不上立刻能定位。这个习惯看着笨但考场上比心算稳得多。最后说一下这一章和后续章节的接续。指令系统定下来之后控制器的任务就是根据操作码产生控制信号硬布线控制器把操作码直接译成控制信号微程序控制器先把操作码映射成微地址。流水线那一章的数据相关本质是两条指令读写同一个寄存器结构相关本质是两条指令抢同一个功能部件比如同时访存。这些概念追根溯源都要回到指令系统里对指令格式和访存方式的规定。所以这一章不是孤立的知识点而是后面几章的公共前提第一遍学扎实后面能省很多返工时间。我个人在实际带人复习时的体会是指令系统这一章最值得投入的不是背而是动手把扩展操作码的树画三遍、把相对寻址的PC计算写五遍。概念看一遍就够计算必须过手过手三遍以上基本就形成肌肉记忆考场上看到题目不用想就能下笔。剩下那些指令类型和CISC、RISC的对比放在考前两周做成小卡片反复过性价比最高。
返回列表