题1
题目
【2017 统考真题】在按字节编址的计算机 M 上, f1 的部分源程序 (阴影部分) 如下。将 f1 中的
int f1(unsigned n){
int sum = 1; power = 1;
for(unsigned i = 0; i <= n - 1; i++){
power *= 2;
sum += power;
}
return sum;
}对应的机器级代码 (包括指令的虚拟地址) 如下:

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

解
为 CISC。 的指令长短不一,不符合 RISC 指令系统的特点。 的机器代码占 。因为 的第一条指令 “push ebp” 所在的虚拟地址为 ,最后一条指令 “ret” 所在的虚拟地址为 ,所以 的机器指令代码长度为 。 。cmp 指令实现 与 的比较功能,进行的是减法运算。在执行 的过程中, ,当 时, ,并且 H。因此,执行第 20 条指令时,在补码加/减运算器中执行 “0 减 FFFFFFFF ” 操作,即 ,此时进位输出 ,低位进位 , 。 中不能用 shl 指令实现 power * 2。因为 shl 指令把一个整数的所有有效数位整体左移,而 中的变量 power 是 float 型,其机器数中不包含最高有效数位,但包含了阶码部分,将其作为一个整体左移时并不能实现 “乘以 2” 的功能,因此 中不能用 shl 指令实现 power * 2。浮点数运算比整型运算要复杂,耗时也较长。