题2.2.5

题目

【2020 统考真题】有实现 的两个C语言函数如下:

unsigned umul (unsigned x ,unsigned y) { return x * y; }
int umul (int x ,int y) { return x * y; }

假定某计算机 M 中的 ALU 只能进行加减运算和逻辑运算。请回答下列问题。

  1. 若M的指令系统中没有乘法指令, 但有加法、减法和位移等指令, 则在M上也能实现上述两个函数中的乘法运算, 为什么?
  2. 若M的指令系统中有乘法指令, 则基于 ALU、位移器、寄存器及相应控制逻辑实现乘法指令时, 控制逻辑的作用是什么?
  3. 针对以下三种情况: a) 没有乘法指令; b) 有使用 ALU 和位移器实现的乘法指令; c) 有使用阵列乘法器实现的乘法指令, 函数 umul () 在哪种情况下执行的时间最长? 在哪种情况下执行的时间最短?说明理由。
  4. 位整数乘法指令可保存 位乘积,当只取低 位作为乘积时,其结果可能会发生溢出。当 时,有符号整数乘法指令和无符号整数乘法指令得到的 位乘积分别是什么 (用十六进制表示)? 此时函数 umul () 和 imul () 的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低 位作为乘法结果时,如何用 位乘积进行溢出判断?

分析

题3

  1. 乘法运算可以通过加法和移位来实现。编译器可以将乘法运算转换为一个循环代码段, 在循环代码段中通过比较、加法和移位等指令实现乘法运算。

  2. 控制逻辑的作用是控制循环次数, 控制加法和移位操作。

  3. 最长, 最短。对于 ,需要用循环程序段实现乘法操作,因而需要反复执行很多条指令, 而每条指令都需要取指令、译码、取数、执行并保存结果, 所以执行时间很长; 对于 ,都只需用一条乘法指令实现乘法操作,不过 中的乘法指令需要多个时钟周期才能完成,而 中的乘法指令可在一个时钟周期内完成,所以 的执行时间最短。

  4. 时,有符号整数和无符号整数乘法指令得到的 64 位乘积都是 00000000 FFFF FFFEH。int 型的表示范围为 ,故函数 imul()的结果溢出; unsigned int 型的表示范围为 ,故函数 的结果不溢出。对于无符号整数乘法,若乘积高 位全为 0,即使低 位全为 1 也正好是 ,不溢出,否则溢出。

注意,无论是无符号数还是有符号数,用 位来表示两个 位整数的相乘结果都不会溢出, 因为 位可以完整地存储两个 位整数的乘积。但是,若只用低 位来表示结果,则可能溢出。 因此,要保证低 位转换成的真值与 位转换成的真值相等才算是不溢出。对于无符号数,只要高 位全为 0,就不会溢出,因为高 位在转换成真值后不会影响低 位的值。对于有符号数,要考虑符号位的影响。当结果是正数时,符号位为 0,要求高 位也全为 0,且低 位的最高位也为 0 (否则正数变负数)。当结果是负数时,符号位为 1,要求高 位也全为 1,且低 位的最高位也为 1 (否则负数变正数)。因此,在有符号数的情况下,高 位相同表示不溢出。

题43