第1题
在按字节编址的计算机M上,题43中f1的部分源程序(阴影部分)与对应的机器级代码(包括指令的虚拟地址)如下:
int fl(unsigned n)
1 00401020 55 push ebp
...... ... ......
for(unsigned i=0; i<=n-1; i++)
...... ... ......
20 0040105E 39 4D F4 cmp dword ptr[ebq-0Ch],ecx
...... ... ......
{ power *= 2;
...... ... ......
23 00401066 D1 E2 shl edx,1
...... ... ......
return sum;
...... ... ......
35 0040107F C3 ret
}
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令。请回答下列问题。
(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中能否也用sh1指令实现power*2?为什么?
答:
(1)M为CISC。(1分)M的指令长短不一,不符合RISC指令系统特点。(1分)
(2)f1的机器代码占96 B。(1分)
因为f1的第一条指令“push ebp”所在的虚拟地址为0040 1020H,最后一条指令“ret”所在的虚拟地址为0040 107FH,所以,f1的机器指令代码长度为0040 107FH-0040 1020H+1 = 60H = 96个字节。(1分)
(3)CF=1。(1分)cmp指令实现i与n-1的比较功能,进行的是减法运算。在执行f1(0)过程中,n=0,当i=0时, i=0000 0000H,并且n-1=FFFF FFFFH。因此,当执行第20条指令时,在补码加/减运算器中执行“0减FFFF FFFFH”的操作,即0000 0000H+0000 0000H+1=0000 0001H,此时,进位输出C=0,减法运算时的借位标志CF=C⊕1=1。(2分)
(4)f2中不能用shl指令实现power*2。(1分)
因为 shl 指令用来将一个整数的所有有效数位作为一个整体左移;而f2中的变量power是float型,其机器数中不包含最高有效数位,但包含了阶码部分,将其作为一个整体左移时并不能实现“乘2”的功能,因而f2中不能用shl指令实现power*2。(2分)浮点数运算比整型运算要复杂,耗时也较长。