4.2.3 指令的寻址方式【2010统考真题】


好的,这是一道非常经典的计算机组成原理关于指令系统的综合题。它要求我们从指令格式出发,反向推导计算机的硬件规格,并能正向地将汇编指令翻译为机器码,最后模拟指令的执行过程。
我们来详细地解析这道题。
首先,附上题目原文:
题目原文
4.2.3 指令的寻址方式
(6)【2010统考真题】某计算机字长为16位,主存地址空间大小为128KB,按字编址,采用单字长指令格式,指令各字段定义如下:
| 15 | 12 | 11 | 6 | 5 | 0 |
|---|---|---|---|---|---|
| OP | Ms | Rs | Md | Rd |
转移指令采用相对寻址方式,相对偏移量用补码表示,寻址方式定义见下表。
| Ms/Md | 寻址方式 | 助记符 | 含义 |
|---|---|---|---|
| 000B | 寄存器直接 | Rn | 操作数 = (Rn) |
| 001B | 寄存器间接 | (Rn) | 操作数 = ((Rn)) |
| 010B | 寄存器间接、自增 | (Rn)+ | 操作数 = ((Rn)), (Rn) + 1 -> Rn |
| 011B | 相对 | D(Rn) | 转移目标地址 = (PC) + (Rn) |
回答下列问题:
- 该指令系统最多可有多少条指令?该计算机最多有多少个通用寄存器?存储器地址寄存器(MAR)和存储器数据寄存器(MDR)至少各需要多少位?
- 转移指令的目标地址范围是多少?
- 若操作码0010B表示加法操作(助记符为add),寄存器R4和R5的编号分别为100B和101B,R4的内容为1234H,R5的内容为5678H,地址1234H中的内容为5678H,5678H中的内容为1234H,则汇编语句“add (R4),(R5)+”(逗号前为源操作数,逗号后为目的操作数)对应的机器码是什么(用十六进制表示)?该指令执行后,哪些寄存器和存储单元的内容会改变?改变后的内容是什么?
综合解析
这道题是对指令系统设计与执行的“全方位”考察,覆盖了:
- 指令格式分析: 从指令的二进制结构反推操作码、寻址方式和寄存器字段的位数,进而推断系统的硬件能力。
- 存储器接口: 理解MAR和MDR的作用及其位数与主存地址空间和编址方式的关系。
- 寻址方式计算: 特别是相对寻址的目标地址范围计算。
- 指令翻译 (汇编->机器码): 能够根据给定的格式和操作数,将一条汇编指令精确地翻译成二进制/十六进制的机器码。
- 指令执行模拟: 能够一步步模拟指令执行周期中的取操作数、运算、存结果、修改寄存器等过程,准确预测执行后的系统状态变化。
三、解题思路与详细分析 (为什么怎么样?)
问题1分析:从指令格式推断硬件规格
-
最多可有多少条指令?
- 指令的数量由**操作码(OP)**字段的位数决定。
- 从图中看,OP字段占位
15到12,共15 - 12 + 1 = 4位。 2⁴ = 16。- 结论: 最多可有 16 条指令。
-
最多有多少个通用寄存器?
- 通用寄存器的数量由指令中用于指定寄存器编号的字段(Rs, Rd)的位数决定。
- 源寄存器Rs字段占位
11到6,共11 - 6 + 1 = 6位。 - 目的寄存器Rd字段占位
5到0,共5 - 0 + 1 = 6位。 - 等等,这里有一个陷阱。寻址方式Ms/Md占了3位,寄存器编号Rn占了3位。所以Rs =
Ms(3位) + Rn(3位)= 6位。 - 我们仔细看寻址方式表,
Rn代表寄存器。而指令格式中,Rs和Rd是操作数字段,它们内部再细分。 - 更正理解:
Ms和Md是寻址方式码,各占3位。Rs和Rd是寄存器编号,各占3位。这样3+3+3+3=12位,加上4位OP码,正好16位。 - 因此,用于指定寄存器的字段是 3位。
2³ = 8。- 结论: 最多有 8 个通用寄存器。
-
MAR和MDR至少需要多少位?
- MAR (Memory Address Register): 存储器地址寄存器,它的位数必须足以存放一个主存地址。
- 主存大小为128KB,按字编址。字长为16位=2B。
- 主存中的“字”的数量 =
128KB / 2B = (2⁷ * 2¹⁰) / 2 = 2¹⁶个字。 - 为了能寻址到
2¹⁶个不同的字,地址至少需要 16 位。 - 结论: MAR至少需要 16 位。
- MDR (Memory Data Register): 存储器数据寄存器,它的位数应该与存储字长一致,以便一次能读写一个完整的数据单元。
- 题目明确指出“字长为16位”。
- 结论: MDR至少需要 16 位。
- MAR (Memory Address Register): 存储器地址寄存器,它的位数必须足以存放一个主存地址。
问题2分析:转移指令的目标地址范围
- 寻址方式: 转移指令采用相对寻址,
目标地址 = (PC) + 偏移量。 - 偏移量: 偏移量由源操作数字段
Ms+Rs(6位) 提供,用补码表示。 - PC: 程序计数器,字长16位,寻址范围是
0到2¹⁶-1。 - 计算偏移量范围:
- 6位补码能表示的整数范围是
-2⁶⁻¹到2⁶⁻¹ - 1,即-32到31。 - 这个偏移量是字偏移,因为是按字编址。
- 6位补码能表示的整数范围是
- 计算目标地址范围:
- 目标地址的最小值发生在PC最小时,偏移量也最小。但由于PC是动态变化的,相对寻址的范围通常是相对于当前PC而言的。题目问的是绝对的目标地址范围。
- 由于PC可以取
0到2¹⁶-1的任何值,偏移量可以取-32到31的任何值,两者相加后,结果仍然可以覆盖整个0到2¹⁶-1的地址空间。 - 例如,当
PC=0,偏移量为31时,可达31。当PC=2¹⁶-1,偏移量为-32时,可达2¹⁶-33。
- 结论: 转移指令可以寻址到整个主存空间,其目标地址范围是
0到2¹⁶-1(或0000H到FFFFH)。
问题3分析:指令翻译与执行
-
汇编指令:
add (R4), (R5)+ -
分解指令:
- 操作:
add,操作码OP = 0010。 - 源操作数:
(R4)- 寻址方式: 寄存器间接,
Ms = 001。 - 寄存器: R4,编号
100。 - 所以
Rs字段是100。
- 寻址方式: 寄存器间接,
- 目的操作数:
(R5)+- 寻址方式: 寄存器间接、自增,
Md = 010。 - 寄存器: R5,编号
101。 - 所以
Rd字段是101。
- 寻址方式: 寄存器间接、自增,
- 操作:
-
组合成机器码:
[OP] [Ms] [Rs] [Md] [Rd][0010] [001] [100] [010] [101]0010 0011 0001 0101(二进制)2 3 1 5(十六进制)- 结论: 对应的机器码是
2315H。
-
模拟指令执行:
- 取源操作数:
- 寻址方式是
(R4)。 - 先读取R4的内容,得到
1234H。 - 然后以
1234H为地址访问主存,读取其内容,得到5678H。 - 所以,源操作数 =
5678H。
- 寻址方式是
- 取目的操作数:
- 寻址方式是
(R5)+。 - 先读取R5的内容,得到
5678H。 - 然后以
5678H为地址访问主存,读取其内容,得到1234H。 - 所以,目的操作数 =
1234H。
- 寻址方式是
- 执行加法:
结果 = 源操作数 + 目的操作数 = 5678H + 1234H = 68ACH。
- 写回结果:
- 结果要写回到目的操作数所在的地址,即
5678H。 - 所以,存储单元
5678H的内容被更新为68ACH。
- 结果要写回到目的操作数所在的地址,即
- 执行自增:
- 目的操作数寻址方式带自增
+。 - R5的内容在使用后(用于寻址)需要加1(因为是按字编址,地址+1就是下一个字)。
R5_new = (R5) + 1 = 5678H + 1 = 5679H。- 所以,寄存器 R5 的内容被更新为
5679H。
- 目的操作数寻址方式带自增
- 取源操作数:
-
总结改变的内容:
- 寄存器 R5: 内容从
5678H变为5679H。 - 存储单元 5678H: 内容从
1234H变为68ACH。
- 寄存器 R5: 内容从
- 结论: R4和存储单元1234H的内容不变。R5 和 存储单元5678H 的内容会改变。改变后 R5 的内容是
5679H,存储单元 5678H 的内容是68ACH。
