2017-44
补充条件(来源:2017 年第 43 题)
已知 f(n)=∑i=0n2i=2n+1-1=(11…1)2,计算 f(n) 的 C 语言函数 f1 如下:
int f1(unsigned n){
int sum=1, power=1;
for(unsigned i=0; i<=n-1; i++){
power *= 2;
sum += power;
}
return sum;
}将 f1 中的 int 都改为 float,可得到计算 f(n) 的另一个函数 f2。假设 unsigned 和 int 型数据都占 32 位,float 采用 IEEE 754 单精度标准。
本题题干
在按字节编址的计算机 M 上,题 43 中 f1 的部分源程序(阴影部分)与对应的机器级代码(包括指令的虚拟地址)如下图所示。

其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令。请回答下列问题。
(1)计算机M是RISC还是CISC?为什么?
(2)f1的机器指令代码共占多少字节?要求给出计算过程。
(3)第20条指令cmp通过i减n-1实现对i和n-1的比较。执行f1(0)过程中,当i=0时,cmp指令执行后,进/借位标志CF的内容是什么?要求给出计算过程。
(4)第 23 条指令 shl 通过左移操作实现了 power *= 2 运算,在 f2 中能否也用 shl 指令实现 power *= 2?为什么?

小程序中我的-账号中心-隐私与账号可绑定网页端账号
(1)计算机M是CISC。因为其指令长短不一,不符合RISC指令系统特点。
(2)f1的机器指令代码共占96字节。计算过程:第一条指令地址为00401020H,最后一条指令ret地址为0040107FH,长度 = 0040107FH - 00401020H + 1 = 60H = 96字节。
(3)CF=C=1。执行 f1(0) 时,n=0、i=0、n-1=FFFFFFFFH。cmp 执行减法 0-FFFFFFFFH,在补码加/减运算器中等价于 00000000H+00000000H+1=00000001H,进位输出 C=0,因此减法借位标志 CF=C=1。
(4)不能用shl指令实现power*2。因为power是float型变量,其机器数包含阶码部分,shl指令将整数所有有效数位左移,但不能正确处理浮点数的阶码,因此无法实现乘2功能。