题2.2.5
题目
【2020 统考真题】有实现
unsigned umul (unsigned x ,unsigned y) { return x * y; }
int umul (int x ,int y) { return x * y; }假定某计算机 M 中的 ALU 只能进行加减运算和逻辑运算。请回答下列问题。
- 若M的指令系统中没有乘法指令, 但有加法、减法和位移等指令, 则在M上也能实现上述两个函数中的乘法运算, 为什么?
- 若M的指令系统中有乘法指令, 则基于 ALU、位移器、寄存器及相应控制逻辑实现乘法指令时, 控制逻辑的作用是什么?
- 针对以下三种情况: a) 没有乘法指令; b) 有使用 ALU 和位移器实现的乘法指令; c) 有使用阵列乘法器实现的乘法指令, 函数 umul () 在哪种情况下执行的时间最长? 在哪种情况下执行的时间最短?说明理由。
位整数乘法指令可保存 位乘积,当只取低 位作为乘积时,其结果可能会发生溢出。当 时,有符号整数乘法指令和无符号整数乘法指令得到的 的 位乘积分别是什么 (用十六进制表示)? 此时函数 umul () 和 imul () 的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低 位作为乘法结果时,如何用 位乘积进行溢出判断?
分析
-
乘法运算可以通过加法和移位来实现。编译器可以将乘法运算转换为一个循环代码段, 在循环代码段中通过比较、加法和移位等指令实现乘法运算。
-
控制逻辑的作用是控制循环次数, 控制加法和移位操作。
-
最长, 最短。对于 ,需要用循环程序段实现乘法操作,因而需要反复执行很多条指令, 而每条指令都需要取指令、译码、取数、执行并保存结果, 所以执行时间很长; 对于 和 ,都只需用一条乘法指令实现乘法操作,不过 中的乘法指令需要多个时钟周期才能完成,而 中的乘法指令可在一个时钟周期内完成,所以 的执行时间最短。 -
当
时,有符号整数和无符号整数乘法指令得到的 64 位乘积都是 00000000 FFFF FFFEH。int 型的表示范围为 ,故函数 imul()的结果溢出; unsigned int 型的表示范围为 ,故函数 的结果不溢出。对于无符号整数乘法,若乘积高 位全为 0,即使低 位全为 1 也正好是 ,不溢出,否则溢出。
注意,无论是无符号数还是有符号数,用
解




