第 3 章 指令系统¶
依据:2016 年版教材第 3 章与配套大纲。下文编号指大纲“考核内容与考核要求”。
复习导航:大纲要求与笔记位置¶
| 大纲条目 | 层次 | 位置 | 学完应能做到 |
|---|---|---|---|
| 1 指令格式设计 | 识记;领会 | 第 1 节 | 说出各类地址数格式,解释指令基本信息与设计原则 |
| 2 指令系统设计 | 识记;领会 | 第 2 节 | 列出八种寻址方式,求有效地址,解释定长与扩展操作码,比较 RISC 与 CISC |
| 3 指令系统实例 | 领会 | 第 3 节 | 说明 MIPS 的指令格式、指令类型与寄存器组织 |
| 4 程序的机器级表示 | 领会 | 第 4 节 | 说明汇编与机器语言、高级语言与机器语言之间的对应关系 |
第 2 条是本章主体,兼有识记与领会。其中“有效地址”和“扩展操作码前缀”两处最易记混,需特别注意。
本章学习目标¶
指令系统规定计算机能够执行哪些操作,以及如何描述操作数和执行顺序。本章要求识记指令格式、操作类型、寻址方式和指令系统风格,理解有效地址、操作码编码、RISC/CISC 与 MIPS 实例。分析程序时要能根据指令确定操作数来源、运算过程、结果位置和后继指令地址。
1 指令格式设计(1,识记、领会)¶
一条指令要完成操作,需要确定操作类型、源操作数、结果位置和后继指令地址。这些信息可以写在指令字段中,也可以由机器约定隐含给出。指令的基本格式由操作码和地址字段组成:操作码说明操作类型,地址字段可以表示存储地址、寄存器编号或立即数。顺序执行时,后继指令地址通常由 PC 的更新得到,无须单独设置地址字段。
| 显式地址数 | 常见语义示意 | 隐含内容 |
|---|---|---|
| 三地址 | A₃←A₁ op A₂ | PC提供后继地址 |
| 二地址 | A₁←A₁ op A₂ | 其中一个源也作为目的 |
| 一地址 | AC←AC op M[A] | 累加器AC |
| 零地址 | 对栈顶两个元素运算并压回结果 | 操作数栈及栈顶位置 |
上述是常见约定,具体字段顺序以题目为准。地址数少可以缩短指令,代价是可能增加中间传送或访存次数。设计指令格式要权衡指令长度、地址空间、操作种类、译码复杂度、代码密度和执行效率。
指令字长、机器字长、存储字长是三个不同的概念。按字节编址时,一条 32 位定长指令占 4 字节,顺序执行时 PC 通常加 4。
2 指令系统设计(2,识记、领会)¶
2.1 操作数与寻址¶
操作数可能是地址、整数、浮点数、字符或逻辑位串。设 A 为指令中的地址字段,R 为寄存器,M[x] 为地址 x 的存储内容,EA 为有效地址:
| 方式 | 操作数/EA | 典型用途 |
|---|---|---|
| 立即 | 操作数就是A,无须求操作数的主存地址 | 常数 |
| 直接 | EA=A,操作数=M[A] | 固定存储位置 |
| 间接 | EA=M[A],操作数=M[EA] | 指针 |
| 寄存器 | 操作数=R[r] | 高频运算 |
| 寄存器间接 | EA=R[r] | 指针指向的数据 |
| 变址 | EA=A+R[index] | 数组元素 |
| 基址 | EA=R[base]+位移 | 段内/对象内数据 |
| 相对 | EA=指定基准PC+位移 | 分支、位置相关代码 |
变址与基址的加法形式相近,区别在于寄存器在程序中的用途不同。用相对寻址时必须核对两点:PC 是当前指令地址还是下一条指令地址;位移是否需乘字长。
例:A=100,R=20,M[100]=300,M[300]=9。立即数为 100;直接方式操作数 300;间接方式操作数 9;基址加位移的 EA 为 120。地址 120 本身不是该处的数据。
2.2 操作类型与控制流¶
传送指令搬运数据;算术指令完成加减乘除;逻辑指令按位运算;移位指令改变位的位置;比较/条件分支根据状态或寄存器比较结果选择后继;无条件跳转直接改变 PC。
过程调用会改变执行顺序,同时保存返回地址,使被调用过程结束后能够继续执行原程序。返回指令据此恢复执行位置。硬件中断也会转入另一段程序,但它由事件触发,无须程序显式执行调用指令;恢复时通常还涉及处理器状态。
条件分支怎样解释比较结果,取决于操作数的数据类型。无符号比较可以利用减法产生的进位或借位信息;有符号比较要结合 SF 与 OF,因为溢出会使结果的符号位失去通常的大小含义。第 2 章讲的标志位,就这样成了控制执行顺序的依据。
2.3 操作码编码¶
定长操作码的译码规则简单,k 位最多编码 2ᵏ 种操作。扩展操作码利用地址字段较少的指令,延长操作码以容纳更多操作。这里有一条硬性要求:短码不能成为另一条有效操作码的前缀,否则译码会产生歧义。
例:指令长 16 位,每地址字段 4 位。假设三地址格式留 4 位操作码,可分配 15 种三地址操作,余下 1 个编码作扩展前缀。二地址操作码于是可以用 8 位,该前缀下共有 16 个二地址编码。若其中再留 1 个继续扩展,则可分配 15 种二地址操作。各长度的编码数不能不加限制地相加。
定长指令字与定长操作码是两个不同的维度:指令总长固定时,仍然可以采用扩展操作码。
2.4 指令系统风格¶
累加器型隐含使用 AC;栈型隐含使用栈顶;通用寄存器型允许显式指定寄存器;Load/Store 型只让装入、存储指令访问数据存储器,算术逻辑运算都在寄存器之间完成。
| 比较 | RISC典型特征 | CISC典型特征 |
|---|---|---|
| 指令设计 | 常用简单操作,格式规整 | 功能与格式较丰富 |
| 寻址 | 方式较少 | 方式较多 |
| 数据访存 | 常采用Load/Store | 可允许运算指令访问内存 |
| 流水线实现 | 较便于规整译码和分段 | 需要处理更多复杂情况 |
这些只是设计倾向,不能据此推断 RISC 每条指令都只用一个时钟,也不能推断 CISC 一定更慢。
3 MIPS 指令集实例(3,领会)¶
教材以 32 位 MIPS 为例:32 个通用寄存器,寄存器字段 5 位;指令长 32 位;0 号寄存器的读值恒为 0。R[x] 表示寄存器 x 的内容。
| 类型 | 字段长度 | 典型指令 |
|---|---|---|
| R型 | op6、rs5、rt5、rd5、shamt5、funct6 | add、sub等 |
| I型 | op6、rs5、rt5、imm16 | addi、lw、sw、beq等 |
| J型 | op6、目标字段26 | j、jal |
add $t0,$t1,$t2:R[t0]←R[t1]+R[t2]。
lw $t0,12($s0):EA=R[s0]+SignExt(12),再从 EA 装入一个字。sw 则把寄存器值写到 EA。立即数字段是字节偏移:若数组的 int 元素占 4 字节,第 i 个元素的偏移就是 4i。
addi 等指令的立即数需符号扩展;andi/ori 的立即数采用零扩展。不能把所有 16 位立即数都统一按符号扩展处理。
条件分支目标=PC+4+(SignExt(imm16)<<2)。若当前 PC=1000H、imm=3,则目标=1010H。J 型伪直接跳转把 PC+4 的高 4 位、26 位字段和低 2 位 00 拼接而成,不能把 26 位字段直接当成完整的字节地址。延迟槽的具体语义按教材例题或题设处理。
4 程序的机器级表示(4,领会)¶
高级语言的选择结构用比较和条件分支跳过某段代码;循环则由条件判断、循环体、更新和回跳组成。数组访问要先按“首地址+下标×元素大小”算出元素地址,取元素时还要解引用。
例如,if (a==b) c=d+e; else c=d-e; 可以先比较 a、b,在不相等时跳到 else 分支。两者相等时执行加法,随后无条件跳过 else 部分;不相等时执行减法,最后在共同的后继位置继续。汇编中的分支条件可能取源程序条件的反向形式,其含义要结合跳转目标判断。
循环的执行次数由循环变量初值、条件检测位置、更新量和退出分支共同决定。机器代码通常不保留源程序的变量名与缩进,因此需要顺着寄存器和存储地址追踪变量,并沿分支目标还原循环结构。条件检测放在循环体之前还是之后,也会影响循环体是否至少执行一次。
5 考核要求¶
本章重点为指令操作码、指令中的操作数、寻址方式、有效地址的概念、指令格式、CISC 与 RISC 的区别及特点、汇编与机器语言以及高级语言与机器语言之间的对应关系;难点为 CISC 与 RISC 的区别、MIPS 指令集体系结构的特点、两层对应关系。
6 教材本章习题¶
本节按“单项选择题/填空题/简答题”分节,答案依据教材附录。
| 自测题(自编) | 参考答案与辨析 |
|---|---|
| 32 个寄存器编号至少几位? | 5 位,2⁵=32。 |
| 间接寻址的地址字段是最终操作数吗? | 不是,要先取得有效地址。 |
| PC=2000H,分支字段 FFFFH,MIPS 目标? | 2004H−4=2000H,位移为负需按符号扩展后左移两位。 |
| Load/Store 型中能直接用内存操作数做普通 add 吗? | 需先 load 到寄存器,再 add,必要时 store。 |
| 两地址指令比三地址指令一定节省程序空间吗? | 单条指令可能更短,但指令条数也可能增加,须整体比较。 |
7 闭卷复习与跨章联系(补充)¶
第 2 章确定数据怎样编码,本章确定指令怎样描述操作,两者合起来构成 ISA 的软件可见部分。第 4 章的数据通路把本章的指令格式落实为控制信号;第 6 章的 I/O 指令则依赖本章的寻址方式访问设备端口。分析机器级程序时,先在寄存器与存储地址之间追踪数据,再沿分支目标还原控制流;这个顺序与第 4 节讲的翻译过程恰好相反。