指令系统练习题
练习 1
简述定长操作码和扩展操作码的区别。
解题思路:
从实际操作码长度、硬件复杂度、执行速度、指令空间使用情况、格式灵活性和指令集易扩展性六个实际关心的方面对比两种格式。
详细步骤:
定长操作码和扩展操作码的区别:
-
操作码长度:
- 定长操作码:操作码长度固定
- 扩展操作码:操作码长度可变
-
硬件复杂度:
- 定长操作码:译码简单,硬件实现简单
- 扩展操作码:译码复杂,硬件实现复杂
-
执行效率:
- 定长操作码:执行快速,并行处理能力强
- 扩展操作码:执行较慢,需要多级译码
-
空间效率:
- 定长操作码:空间浪费,某些指令不需要所有地址码
- 扩展操作码:空间效率高,充分利用指令空间
-
灵活性:
- 定长操作码:灵活性差,难以适应复杂指令
- 扩展操作码:灵活性高,支持不同复杂度的指令
-
扩展性:
- 定长操作码:扩展性差
- 扩展操作码:扩展性好,便于增加新指令
最终答案:
定长操作码的指令格式统一、译码快、简单,代价是浪费编码空间、扩展性差;扩展操作码能在同样的空间里容纳更多指令,并可扩展到新指令,代价是译码器更慢、更复杂。二者的选择是译码简单性与编码密度之间的权衡。
练习 2
举例说明直接寻址和间接寻址的区别。
解题思路:
从地址码、指令形式、访存次数和地址计算四个方面定义每种寻址方式,再用一段小的内存映像执行同一条指令,展示不同结果。
详细步骤:
直接寻址和间接寻址的区别:
直接寻址:
- 地址码即为操作数地址
- 格式:
LOAD R1, [1000] - 含义:从地址 1000 加载数据到寄存器 R1
- 访存次数:1 次
- 地址计算:直接使用地址码
间接寻址:
- 地址码存放操作数地址的地址
- 格式:
LOAD R1, [[1000]] - 含义:从地址 1000 的内容作为地址,再加载数据到寄存器 R1
- 访存次数:2 次
- 地址计算:先取地址,再取数据
举例说明: 假设内存内容:
- 地址 1000:存储值 2000
- 地址 2000:存储值 42
直接寻址:LOAD R1, [1000] → R1 = 2000
间接寻址:LOAD R1, [[1000]] → R1 = 42
最终答案:
直接寻址把地址码直接作为操作数的地址,只需一次访存;间接寻址则把地址码看作指向操作数的指针,需要两次访存。在给出的例子中,直接寻址方式取出的是 2000,间接寻址方式取出的是 42。
练习 3
什么是基址寻址和变址寻址?
解题思路:
给出每种寻址方式的有效地址公式和所用寄存器的作用,再从三个差异维度对比两者。
详细步骤:
基址寻址:
- 有效地址 = 基址寄存器 + 偏移量
- 基址寄存器存放基地址
- 偏移量在指令中指定
- 支持程序重定位
- 扩大地址范围
变址寻址:
- 有效地址 = 变址寄存器 + 基地址
- 变址寄存器存放索引值
- 基地址在指令中指定
- 支持数组访问
- 循环控制方便
区别:
-
寄存器作用:
- 基址寻址:基址寄存器存放基地址
- 变址寻址:变址寄存器存放索引值
-
应用场景:
- 基址寻址:程序重定位、地址转换
- 变址寻址:数组访问、循环控制
-
地址计算:
- 基址寻址:基地址 + 偏移量
- 变址寻址:基地址 + 索引值
最终答案:
基址寻址把位移量加到基址寄存器上,使该寄存器成为存储区域的固定基准,并支持重定位;变址寻址把指令中给出的基址与变址寄存器中的值相加,使寄存器成为可变部分,并支持数组访问。
练习 4
CISC 与 RISC 的主要区别是什么?
解题思路:
从指令、硬件、软件支持、性能特征以及各自适用的工作负载五个方面对比两种体系结构。
详细步骤:
CISC 与 RISC 的主要区别:
-
指令特点:
- CISC:指令复杂,功能强大,长度可变
- RISC:指令简单,功能单一,长度固定
-
硬件实现:
- CISC:微程序控制,译码复杂,多周期执行
- RISC:硬布线控制,译码简单,单周期执行
-
软件支持:
- CISC:代码密度高,编译简单,兼容性好
- RISC:代码密度低,编译复杂,兼容性差
-
性能特点:
- CISC:执行效率低,硬件复杂,难以流水线
- RISC:执行效率高,硬件简单,便于流水线
-
应用场景:
- CISC:桌面计算、服务器、嵌入式系统
- RISC:移动设备、高性能计算、物联网
最终答案:
CISC 以复杂的译码和不均衡的时序为代价,换取代码密度和兼容性;RISC 以代码长度和编译器复杂度为代价,换取简单、统一、对流水线友好的执行。如今的处理器设计把两者结合起来,对外提供 CISC 接口、执行 RISC 核心。
练习 5
指令的有效地址如何计算?
解题思路:
逐一考察各种寻址方式,写出每种方式下有效地址的公式,并注明相应值是直接使用还是需要先取。
详细步骤:
指令的有效地址计算方法:
-
立即寻址:
- 有效地址 = 指令中的立即数
- 无需计算,直接使用
-
直接寻址:
- 有效地址 = 地址码
- 直接使用地址码作为地址
-
间接寻址:
- 有效地址 = [地址码]
- 先取地址码的内容作为地址
-
寄存器寻址:
- 有效地址 = 寄存器内容
- 直接使用寄存器值
-
寄存器间接寻址:
- 有效地址 = [寄存器内容]
- 先取寄存器内容作为地址
-
基址寻址:
- 有效地址 = 基址寄存器 + 偏移量
- 基址寄存器内容加上偏移量
-
变址寻址:
- 有效地址 = 变址寄存器 + 基地址
- 变址寄存器内容加上基地址
-
相对寻址:
- 有效地址 = PC + 偏移量
- 程序计数器加上偏移量
最终答案:
有效地址总是依据寻址方式,由指令中的地址码、寄存器或程序计数器计算得到。各种寻址方式的差别只在于这些成分的来源,以及计算过程需要多少次访存。
练习 6
分析题:分析不同寻址方式对指令执行效率的影响。
解题思路:
按各寻址方式所需的访存次数排序,说明每种方式适用的场合,再由此得出相应的优化建议。
详细步骤:
不同寻址方式对指令执行效率的影响:
-
立即寻址:
- 效率:最高,无需访存
- 应用:常量赋值、立即数运算
- 限制:操作数大小受限
-
寄存器寻址:
- 效率:很高,无需访存
- 应用:频繁访问的数据
- 限制:寄存器数量有限
-
直接寻址:
- 效率:中等,需要一次访存
- 应用:访问固定地址的数据
- 限制:地址范围受限
-
寄存器间接寻址:
- 效率:中等,需要一次访存
- 应用:数组访问、指针操作
- 优势:支持动态地址
-
间接寻址:
- 效率:较低,需要两次访存
- 应用:指针操作、动态寻址
- 优势:支持复杂地址计算
-
基址寻址:
- 效率:中等,需要一次访存
- 应用:程序重定位、地址转换
- 优势:支持程序重定位
-
变址寻址:
- 效率:中等,需要一次访存
- 应用:数组处理、循环控制
- 优势:支持数组访问
-
相对寻址:
- 效率:中等,需要一次访存
- 应用:跳转指令、分支指令
- 优势:支持程序重定位
优化建议:
- 优先使用立即寻址和寄存器寻址
- 合理使用寄存器,减少访存次数
- 根据应用特点选择合适的寻址方式
最终答案:
立即寻址和寄存器寻址效率最高,因为完全不需要访存;单次访存的寻址方式居中;间接寻址代价最高,因为它需要两次访存。由此得到的优化原则是:只要应用程序允许,就让操作数留在寄存器中。
练习 7
计算题:假设有一个 32 位指令系统,采用定长操作码格式,操作码 8 位,地址码 24 位,计算支持的指令数量和地址范围。
解题思路:
使用 n 位字段所能表示的码值个数这一规律,依次用于操作码和地址码。
详细步骤:
计算过程:
-
指令数量:
- 操作码位数:8 位
- 支持的指令数量:2^8 = 256 条指令
-
地址范围:
- 地址码位数:24 位
- 地址范围:0 到 2^24 - 1 = 0 到 16,777,215
- 地址空间:16MB
-
指令格式:
[操作码(8位)] [地址码(24位)] -
分析:
- 指令数量适中,满足基本需求
- 地址范围较大,支持大程序
- 格式简单,便于硬件实现
最终答案:
8 位操作码可支持 256 条指令,24 位地址码覆盖 0 到 16,777,215 之间的地址,即 16MB 的地址空间。
练习 8
设计题:设计一个支持数组访问的指令系统,要求支持基址寻址和变址寻址。
解题思路:
先设计寄存器组,再确定指令格式和寻址方式,然后给出几条能体现各寻址方式的指令,最后列出该设计带来的好处。
详细步骤:
指令系统设计:
-
寄存器设计:
- 基址寄存器:BR(Base Register)
- 变址寄存器:IR(Index Register)
- 通用寄存器:R0-R15
-
指令格式:
[操作码(8位)] [目标寄存器(4位)] [基址寄存器(4位)] [变址寄存器(4位)] [偏移量(12位)] -
寻址方式:
- 基址寻址:有效地址 = BR + 偏移量
- 变址寻址:有效地址 = IR + 基地址
- 基址变址寻址:有效地址 = BR + IR + 偏移量
-
指令示例:
; 基址寻址 LOAD R1, BR, 100 ; R1 = [BR + 100] ; 变址寻址 LOAD R2, IR, 200 ; R2 = [IR + 200] ; 基址变址寻址 LOAD R3, BR, IR, 50 ; R3 = [BR + IR + 50] -
优势:
- 支持数组访问
- 支持程序重定位
- 支持循环控制
- 地址计算灵活
最终答案:
一种配有基址寄存器、变址寄存器和通用寄存器的设计,采用包含目的寄存器、基址寄存器、变址寄存器和 12 位位移量的指令格式,可以用同一套指令覆盖基址寻址、变址寻址和基址加变址寻址,从而覆盖数组访问、重定位和循环控制。
