第 5 题
第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 第 5 题
标志寄存器用来存放执行指令得到的各种标志等信息,因此,标志寄存器中的内容通常是在执行指令过程中由 CPU 根据指令执行结果自动生成的,用户不能通过指令直接指定标志寄存器编号来修改其内容。标志寄存器一般是专用寄存器,而不是通用寄存器,因此,它也没有编号,不能在指令中直接指定其编号来访问它,即它不是用户可见寄存器。标志寄存器中的标志位主要用于条件转移或条件设置类指令中的条件判断。综上所述,答案为选项 B。
## 第 6 题
R-R 型指令是指两个源操作数和目的操作数都在寄存器中;R-S 型指令是指一个源操作数在寄存器,另一个源操作数和目的操作数共用同一个存储单元;S-S 型指令是指两个源操作数和目的操作数都在存储单元中;R-I 型指令指一个源操作数是立即数,另一个源操作数和目的操作数都在寄存器中。显然,S-S 型指令需要访问存储器的次数最多,除了取指令需要访存外,取两个源操作数和存结果都要访存。因此,S-S 型指令的执行时间最长。答案为选项 C。
## 第 12 题
变址寻址方式下,有效地址为形式地址加上变址值,变址值存放在变址寄存器中,因此,变址寻址方式的有效地址为 $\mathrm{R}[X] + D$。答案为选项 A。
## 第 13 题
相对寻址方式下,基准地址为 PC 中的内容,在计算转移目标地址时,CPU 已经从存储器中取出了操作码和相对位移量,因此,PC 中已经是转移指令所在地址加 2 的值,即 $200\mathrm{CH} + 2 = 200\mathrm{EH}$。相对寻址方式下,转移目标地址 $= \mathrm{PC} +$ 位移量,因此,位移量 $= \mathrm{转移目标地址} - \mathrm{PC} = 1\mathrm{FB0H} - 200\mathrm{EH} = 0001111110110000 - 001000000001110 = 0001111110110000 + 1101111111110010 = 1111111110100010$。因为位移量占一个字节,所以,在指令中的位移量为 A2H。运算时位移量扩展 8 位,即 FFA2H,位移量为负数。答案为选项 C。
## 第 14 题
变址寻址方式下,有效地址为变址寄存器中的值加上形式地址,变址值 $124 = 1111100\mathrm{B} = 7\mathrm{CH}$,有效地址为 $\mathrm{B000H + 007CH = B07CH}$。答案为选项 C。
## 第 15 题
数组元素的访问通常使用变址寻址方式,数组起始地址通常是指令中直接给出的形式地址,下标变量存放在变址寄存器中,本题中,数组元素类型为 float,故每个数组元素占 4 字节,最后一个元素的下标为 99,其首地址为 $\mathrm{C0001000H + 99\times 4 = C0001000H + 11000}$
<!-- page: 97 -->
1100B = C000 118CH。因为采用小端方式并按字节编址,所以,MSB所在的地址应为C000118FH。答案为选项D。
## 第16题
一次间接寻址方式下,指令中给出的地址码为操作数的有效地址的地址,所以,操作数的有效地址是指令中地址码所指出的存储单元中的内容,即12FCH。答案为选项B。
## 第17题
寄存器间接寻址方式下,操作数的有效地址在指令中给出的寄存器中,因此,8号寄存器中的内容为操作数的有效地址,即 1200H。答案为选项A。
## 第18题
基址寻址方式下,操作数的有效地址为基址寄存器内容加上形式地址,因此,操作数ABCD00FFH存放在C000 0000H + FF00H = C000 0000 + FFFF FF00 = BFFF FF00H。因为是大端方式并按字节编址,所以LSB(FFH)存放的地址为BFFF FF03H。答案为选项D。
## 第19题
操作数的地址与第18题一样,也是BFFF FF00H。因为计算机按字节编址,采用小端方式,且操作数为16位,占两个字节,因此,操作数的MSB存放的地址是BFFF FF01H。答案为选项D。
## 第21题
传送指令实现在部件之间进行数据传送,这里的部件一定是能够存储信息的部件,选项中的CPU实际上是指CPU中的寄存器。对于选项A,出栈/入栈指令(push/pop)实现的是CPU中的通用寄存器和栈顶之间的数据传送;对于选项B,访存指令(load/store)完成的是CPU中的通用寄存器和存储单元之间的数据传送;对于选项C,I/O指令(in/out)完成的是CPU中的通用寄存器和I/O端口之间的数据传送;对于选项D,寄存器传送指令(move)完成的是通用寄存器和通用寄存器之间的数据传送,如果说成是CPU和寄存器之间的数据传送,则意味着CPU中还有其他的非寄存器部件能存储数据,显然,这种认识是错误的。答案为选项D。
## 第24题
调用指令(转子指令)主要用于子程序(过程或函数)调用。例如,在C语言程序中遇到一个函数调用时,编译器将会生成一条调用指令。为了能保证从被调用过程返回到调用过程继续执行,必须确定并保存返回地址,这个地址是调用指令随后的指令的地址,返回地址只能是调用指令来计算并保存,因为执行调用指令后就跳转到了被调用过程,因此无法获取返回地址。为了保证嵌套调用时能够返回到调用过程,必须将返回地址压栈。如果不压栈而保存在特定寄存器,则后面执行的调用指令会把前面调用指令保存的返回地址冲掉,只有调用叶子过程(叶子过程将不再有新的过程调用,因此是非嵌套调用)时的调用指令可以把返回地址存放到特定寄存器中。调用指令执行时将无条件跳转到目标地址处,这个目标地址就是被调用过程第一条指令的地址,它一定在调用指令中明显给出。综上所述,答案为选项D。
## 第26题
栈是一个动态存储区,每次过程调用都会生成一个新的栈帧,栈顶的地址存放在一个特
<!-- page: 98 -->
定的栈指针寄存器中,可以使用专门的入栈和出栈指令来访问栈顶数据,也可以通过普通的访存指令来读写栈帧中某个位置的内容,例如,MIPS 架构就没有专门的入栈和出栈指令,只能通过 lw/sw 等访存指令进行栈中信息的读写;IA-32 架构中虽有专门的出栈和入栈指令,但是,也可以通过 MOV 指令来访问栈中的信息。当一个过程执行结束时,总是要通过返回指令返回到它的调用过程,在返回到调用过程后,被调用过程对应的栈帧必须被释放掉,通常通过修改栈顶位置来实现,即修改栈指针寄存器的内容。综上所述,答案为选项 C。
## 4.6 分析应用题
1. 以下哪种类型的指令执行后一定会改变程序执行顺序?
条件跳转指令、无条件跳转指令、调用指令、过程返回指令、自陷指令、中断返回指令。
### 【分析解答】
给出的几种指令中,一定会改变程序执行顺序的指令类型有无条件跳转指令、过程调用指令、过程返回指令、自陷指令、中断返回指令。而条件跳转指令则在条件不满足时顺序执行指令。
2. 某计算机字长 32 位,CPU 中有 32 个 32 位通用寄存器,采用单字长定长指令字格式,操作码占 6 位,其中已包含对寻址方式的指定。对于存储器直接寻址方式的 R-S 型指令,能直接寻址的最大地址空间大小是多少?对于采用通用寄存器作为基址寄存器的 R-S 型指令,则能直接寻址的最大地址空间大小是多少?
### 【分析解答】
因为有 32 个通用寄存器,所以寄存器编号为 5 位。存储器直接寻址的 R-S 型指令的一个操作数在寄存器中,所以指令中有一个 5 位的寄存器编号,另一个地址码是直接地址,共有 $32 - 6 - 5 = 21$ 位。所以,能直接寻址的最大地址空间大小是 $2^{21}$ 个字。
基址寻址的 R-S 型指令的一个操作数在寄存器中,另一个操作数在基址寻址的存储单元中,因为采用通用寄存器作为基址寄存器,必须在指令中明显指出基址寄存器是哪个通用寄存器,所以基址寄存器的编号占 5 位,剩下的位数 $(32 - 6 - 5 - 5 = 16$ 位)是位移量。通用寄存器的位数是 32 位,所以基址寄存器中的基准地址位数是 32 位。一个 32 位的基准地址加上一个 16 位的位移量,其结果是一个 32 位的主存地址。所以,能直接寻址的最大地址空间大小是 $2^{32}$ 个字。
3. 若采用相对寻址方式的跳转指令占两个字节,第一字节是操作码,第二字节是相对位移量(用补码表示)。CPU 在执行指令时,每次 CPU 从存储器取出一个字节,并自动完成 $\mathrm{PC} + 1 \rightarrow \mathrm{PC}$。假设执行到该跳转指令时 PC 的内容为 200AH,如果要求跳转到 2000H,则该跳转指令第二字节的内容应为多少?
### 【分析解答】
执行到该跳转指令时 PC 的内容为 200AH,因此,在 CPU 取指令过程中,取出第一字节的操作码后,PC 的内容为 200BH,取出第二字节的位移量后,PC 的内容为 200CH,因此,在执行该跳转指令计算跳转目标地址时,PC 已经是 200CH 了。因为跳转目标地址为 2000H,所以,此时位移量是 $2000\mathrm{H} - 200\mathrm{CH} = -0\mathrm{CH}$,用补码表示为 $100\mathrm{H} - 0\mathrm{CH} = \mathrm{F4H}$。
4. 某指令系统的指令字是 16 位,每个地址码为 6 位。若二地址指令 15 条,一地址指令
<!-- page: 99 -->
48条,则剩下的零地址指令最多有多少条?
## 【分析解答】
操作码按短到长进行扩展编码。对于二地址指令,两个地址码占12位,剩下的操作码占4位,最多有16种编码,15条指令用掉15种编码 0000~1110,还剩一种编码1111;对于一地址指令,高4位操作码一定是1111,最低6位是一个地址码,剩下的中间操作码还有6位,最多可以有64种编码,指令条数是48,因此只需从64种编码中选48种作为48条指令的操作码。可采用如下的操作码编码方案:1111 0 00000~1111 0 11111(共32种编码)、1111 1 0 0000~1111 1 0 1111(共16种编码);对于零地址指令,其高10位操作码的编码空间为1111 1 1 0000~1111 1 1 1111,因此,高10位共有16种编码可用,再加上低6位的64种编码,一共可组合成 16×64 = 1024 种编码,可以分别分配给1024种指令。故剩下的零地址指令最多有1024条。
5. 某计算机指令系统采用定长指令字格式,指令字长16位,每个操作数的地址码长6位。指令分二地址、单地址和零地址三类。若二地址指令有 $k_{2}$ 条,无地址指令有 $k_{0}$ 条,则单地址指令最多有多少条?
## 【分析解答】
假设单地址指令有 $k_{1}$ 条,则 $((16 - k_{2}) \times 2^{6} - k_{1}) \times 2^{6} = k_{0}$,所以 $k_{1} = (16 - k_{2}) \times 2^{6} - k_{0} / 2^{6}$。
6. 假设某计算机按字节编址,采用小端方式存储信息。其中某指令的操作数为32位字,采用基址寻址方式,若指令中形式地址(用补码表示)为B000H,当前基址寄存器的内容为80004000H,则该指令的操作数地址为多少?若该操作数的机器码为12345678H,则该操作数的4字节12H、34H、56H和78H的存放地址分别是什么?
## 【分析解答】
$\mathrm{B000H = 101100000000000B}$ 形式地址的值为-10100000000000B=-5000H,因此操作数的有效地址为80004000H-5000H=7FFF F000H。小端方式下,LSB的地址为操作数地址,即书写顺序与存储顺序相反,因而12H、34H、56H和78H的存放地址分别是7FFF F003H、7FFF F002H、7FFF F001H和7FFF F000H。
7. 一次间接寻址指令中给出的地址码为2000H,地址为2000H的内存单元中的内容为3000H,地址为3000H的内存单元的内容为4000H,而4000H单元的内容为5000H,则该操作数的有效地址是多少?该操作数的值是多少?
## 【分析解答】
一次间接寻址方式的指令中给出的地址码是一个间接地址,即操作数地址的地址。所以,操作数的有效地址应该是地址码2000H中的内容,即3000H;有效地址所指出的内存单元的内容是操作数,即4000H是操作数。
8. 假设地址为 1200H 的内存单元中的内容为 120CH,地址为 120CH 的内存单元的内容为 38B8H,而 38B8H 单元的内容为 88F9H。以下各情况下操作数的有效地址和操作数各是多少?
(1) 操作数采用变址寻址,变址寄存器中存放内容的值为 12,指令中给出的形式地址为 1200H。
(2) 操作数采用一次间接寻址,指令中给出的地址码为 120CH。
<!-- page: 100 -->
(3) 操作数采用寄存器间接寻址,指令中给出的寄存器编号为 8,8 号寄存器的内容为 1200H。
## 【分析解答】
(1) 有效地址为 000CH + 1200H = 120CH,操作数为 38B8H。
(2) 有效地址为 38B8H,操作数为 88F9H。
(3) 有效地址为 1200H,操作数为 120CH。
9. 某计算机字长 16 位,存储器存取宽度为 16 位,即每次从存储器取出 16 位。CPU 中有 8 个 16 位通用寄存器。现为该机设计指令系统,要求指令长度为字长的整数倍,至多支持 64 种不同操作,每个操作数都支持 4 种寻址方式:立即(I)、寄存器直接(R)、寄存器间接(S)和变址(X)寻址方式。存储器地址位数和立即数均为 16 位,任何一个通用寄存器都可作变址寄存器,支持以下 7 种二地址指令格式(R、I、S、X 代表上述 4 种寻址方式):R-R 型、R-I 型、R-S 型、R-X 型、X-I 型、S-I 型、S-S 型。请设计该指令系统的 7 种指令格式,给出每种格式的指令长度、各字段所占位数和含义,并说明每种格式指令的功能以及需要的访存次数。
## 【分析解答】
因为至多有 64 种操作,所以操作码字段只需要 6 位;有 8 个通用寄存器,所以寄存器编号至少占 3 位;寻址方式有 4 种,所以寻址方式位至少占 2 位;直接地址和立即数都是 16 位;任何通用寄存器都可作变址寄存器,所以指令中要明显指定变址寄存器,其编号占 3 位;指令总位数是 16 的倍数。此外,指令格式应尽量规整,指令长度应尽量短。按照上述这些要求设计出的指令格式可以有很多种。以下是采用二地址指令格式的两种指令格式设计方案,R-I、X-I 和 S-I 三种指令格式中添了 3 个 0,是为了补足位数,以使指令长度为 16 的倍数。这两种方案得到的 R-R、R-S 和 S-S 型指令都是 16 位,R-I、R-X 和 S-I 型指令都是 32 位,X-I 型指令是 48 位。
指令格式示例 1:如图 4.1 所示,用专门的“类型”字段(最左边 4 位)说明不同的指令类型,无须对两个操作数的寻址方式分别说明。7 种指令类型只要 3 位编码即可,所以最后一位总是“0”。
图 4.1 第一种指令格式示例
<!-- page: 101 -->
指令格式示例2:如图4.2所示,用专门的“寻址方式”字段分别说明两个操作数的寻址方式。其定义为:00-立即;01-寄直;10-寄间;11-变址。
图4.2 第二种指令格式示例
存储器存取宽度为16位,每次从存储器取出16位。因此,读取16、32和48位指令分别需要1、2和3次存储器访问。各类指令的功能和访存次数分别说明如下(M[x]表示存储器地址x中的内容,R[x]表示寄存器x中的内容)。
R-R型指令功能为R[Rt]←R[Rt] op R[Rs],取指令时访存1次;R-I型指令功能为R[Rt]←R[Rt] op Imm16,取指令时访存2次;R-S型指令功能为R[Rt]←R[Rt] op M[R[Rs]],取指令和取第2个源操作数各访存1次,共访存2次;R-X型指令功能为R[Rt]←R[Rt] op M[R[Rx]+Offset],取指令访存2次,取第2个源操作数访存1次,共访存3次;X-I型功能为M[R[Rx]+Offset]←M[R[Rx]+Offset] op Imm16,取指令访存3次,取第一个源操作数访存1次,写结果访存1次,共访存5次;S-I型指令功能为M[R[Rt]]←M[R[Rt]] op Imm16,取指令访存2次,取第一个源操作数和写结果各访存1次,共访存4次;S-S型功能为M[R[Rt]]←M[R[Rt]] op M[R[Rs]],取指令访存1次,取第一个源操作数、取第二个源操作数和写结果各访存1次,共访存4次。
10. 某计算机字长为 16 位,主存地址空间大小为 $128 \mathrm{KB}$,按字编址。采用单字长定长指令格式,指令各字段定义如下。
跳转指令采用相对寻址方式,相对偏移量用补码表示。寻址方式定义如表4.1所示。
表 4.1 题 10 中定义的寻址方式及其含义
[tbl-19.md](tbl-19.md)
<!-- page: 102 -->
续表
[tbl-20.md](tbl-20.md)
注:M[x]表示存储器地址 x 中的内容,R[x]表示寄存器 x 中的内容。
请回答下列问题:
(1)该指令系统最多可有多少条指令?该计算机最多有多少个通用寄存器?存储器地址寄存器(MAR)和存储器数据寄存器(MDR)至少各需要多少位?
(2)跳转指令的目标地址范围是多少?
(3)若操作码0010B表示加法操作(助记符为add),寄存器R4和R5的编号分别为100B和101B,R4的内容为 $1234\mathrm{H}$ ,R5的内容为 $5678\mathrm{H}$ ,地址 $1234\mathrm{H}$ 中的内容为 $5678\mathrm{H}$ ,地址 $5678\mathrm{H}$ 中的内容为 $1234\mathrm{H}$ ,则汇编语句“add(R4), $(R5)+$ ”(逗号前为第一源操作数,逗号后为第二源操作数和目的操作数)对应的机器码是什么(用十六进制表示)?该指令执行后,哪些寄存器和存储单元的内容会改变?改变后的内容是什么?
【分析解答】
(1)因为采用单字长指令格式,操作码字段占 4 位,所以最多有 16 条指令;指令中通用寄存器编号占 3 位,所以最多有 8 个通用寄存器;因为地址空间大小为 $128\mathrm{KB}$ ,按字编址,故共有 $64\mathrm{K}$ 个存储单元,因而地址位数为 16 位,所以 MAR 至少为 16 位;因为字长为 16 位,所以 MDR 至少为 16 位。
(2)因为地址位数和字长都为16位,所以PC和通用寄存器位数均为16位,两个16位数据相加其结果也为16位,即跳转目标地址位数为16位,因而能在整个地址空间跳转,即跳转目标地址的范围为 $0000\mathrm{H}\sim \mathrm{FFFFH}$
(3)要得到汇编语句“add (R4), (R5)+”对应的机器码,只要将其对应的指令代码各个字段拼接起来即可。显然,add对应op字段,为0010B;(R4)的寻址方式字段为001B,R4的编号为100B;(R5)+的寻址方式字段为010B,R5的编号为101B;因此,对应的机器码为0010001100010101B,用十六进制表示为2315H。指令“add (R4), (R5)+”的功能为:M[R[R5]]←M[R[R5]]+M[R[R4]], R[R5]←R[R5]+1。已知R[R4]=1234H,R[R5]=5678H,M[1234H]=5678H,M[5678H]=1234H,因为1234H+5678H=68ACH,所以5678H单元中的内容从1234H改变为68ACH,同时R5中的内容从5678H变为5679H。
11. 假定 A 是一个 32 位的地址,A_upper 和 A_lower 分别表示地址 A 的高、低 16 位,以下 MIPS 指令代码用来将存放在存储器地址 A 处的机器数读入寄存器 $s0 中。
lui $t0, A_upper
#将A_upper的低位添加16个0,送$t0
ori $t0, $t0, A_lower
#将A_lower的高位扩展0后与$t0的内容相"或",送$t0
lw $s0, 0($t0)
#将$t0的内容和0相加得到有效地址,从中取数送$s0
上述功能也能用以下两条MIPS指令来实现。请问第一条指令中A_upper_adjusted的值如何得到?
lui $t0, A_upper_adjusted
lw $s0, A_lower($t0)
#将A_lower进行符号扩展后,和$t0的内容相加,得到有效
#地址,从中取数送$s0
<!-- page: 103 -->
## 【分析解答】
因为 MIPS 指令中的立即数据只能是 16 位,所以一个 32 位的地址无法直接传送到一个 32 位寄存器中。第一种实现方案是通过将地址 A 的高 16 位和低 16 位分别作为两条指令的立即数,将它们用或操作合并到一个 32 位寄存器。这样,第三条取数指令 lw 的偏移量就是 0。第二种方案中取数指令 lw 的偏移量是 A 的低位部分 A_lower,由于取数指令 lw 在计算内存单元地址时对偏移量采用的是符号扩展,所以要使得高 16 位最终的结果为 A_upper,必须对 A_upper 进行以下调整:若 A_lower 的最高位(看作低 16 位数的符号位)是 0,则 A_upper_adjusted = A_upper,这样,A_lower 符号扩展后高 16 位为全 0,和高 16 位 A_upper 相加后,高 16 位还是 A_upper;若 A_lower 的最高位是 1,则 A_lower 符号扩展后高 16 位为全 1,此时,A_upper_adjusted 应满足:FFFFH + A_upper_adjusted = A_upper。而因为 FFFFH + A_upper + 1 = A_upper(最高位向前面的进位被丢弃),所以,A_upper_adjusted = A_upper + 1。综上所述,A_upper_adjusted = A_upper + sign(A_lower)。sign(A_lower)表示 A 的低 16 位中最高位的符号。
12. 除了硬件乘法器外,还可以用移位和加法指令来实现乘法运算。在乘以较小的常数时,这种办法很有效。在不考虑溢出的情况下,假设要将 $s0 的内容与 6 相乘,乘积存入 $s1 中。请写出一段指令条数最少且不包括乘法指令的 MIPS 代码。