组成原理
2020-43
有实现 x×y 的两个 C 语言函数如下:
unsigned umul(unsigned x, unsigned y) { return x * y; }
int imul(int x, int y) { return x * y; }假定某计算机 M 中 ALU 只能进行加减运算和逻辑运算。请回答下列问题。
1)若 M 的指令系统中没有乘法指令,但有加法、减法和位移等指令,则在 M 上也能实现上述两个函数中的乘法运算,为什么?
2)若 M 的指令系统中有乘法指令,则基于 ALU、位移器、寄存器以及相应控制逻辑实现乘法指令时,控制逻辑的作用是什么?
3)针对以下三种情况:①没有乘法指令;②使用 ALU 和位移器实现乘法指令;③使用阵列乘法器实现乘法指令,函数 umul() 在哪种情况下执行时间最长?哪种情况下执行时间最短?说明理由。
4)n 位整数乘法指令可保存 2n 位乘积,当仅取低 n 位作为乘积时,结果可能溢出。当 n=32、x=231-1、y=2 时,带符号整数乘法指令和无符号整数乘法指令得到的 x× y 的 2n 位乘积分别是什么(用十六进制表示)?函数 umul() 和 imul() 的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低 n 位作为乘法结果时,如何用 2n 位乘积进行溢出判断?
答案
(1)乘法可以通过加法和移位组成的循环程序实现,因此即使没有乘法指令也能完成两个函数中的乘法运算。
(2)控制逻辑用于控制循环次数,并控制每一步的加法和移位操作。
(3)情况①执行时间最长,情况③执行时间最短。①需要执行多条软件指令;②和③使用乘法指令,而③的阵列乘法器可在一个时钟周期内完成乘法。
(4)两种乘法指令得到的 64 位乘积均为 00000000FFFFFFFEH。
umul():不溢出;imul():溢出。
无符号乘法只取低 n 位时,若 2n 位乘积的高 n 位全为 0,则不溢出;否则溢出。