讨论课实施方法:
每次讨论课布置三道选题,每个班分为六个小组,同一道题有两个小组选择(小组间协商或随机分配)并进行准备。在讨论课时,每道题随机选择一组进行汇报,另外一组或其他组进行质疑与提问。
讨论课的成绩由本组表现及个人表现组成。
第三次讨论课选题
选题一
编译器在编译if-else语句时,是通过向后跳转到不同的地址来实现判断分支,但在处理if语句时,实际上编译器是不知道if中的判断语句及中间的执行体是要占用多少条指令的,所以只能是先将跳转地址置空,在解析完成后再来回填需要跳转的实际地址,请给出回填地址的算法,并通过示例与实际代码进行验证。(需要考虑if-else嵌套的情况)
选题二
在c程序中,全局变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在代码区。请写一个代码进行演示,同时分析堆与栈的异同。
选题三
对于以下c程序:
#include <stdio.h>
int main()
{
int i=0;
int j=0;
switch(i)
{
case 1:
j+=1;
break;
case 2:
j+=2;
break;
case 3:
j+=3;
break;
case 4:
j+=4;
break;
case 5:
j+=5;
case 6:
j+=70;
break;
default:
j+=5;
break;
}
return 0;
}
(1)将其编译成汇编代码,找到跳转表,并分析汇编代码是如何通过跳转表来完成switch功能的;
(2)将分支条件调整为case 6,case 2,case 5,case 3,case 4,case 1(即交换一下分支条件顺序),观察跳转表的变化情况。
(3)将分支条件调整为case 5, case 3, case 2, case1,或是调整为case 138,case 106, case 2, case 9, case 68后,汇编后的代码中不包括跳转表,而是采用cmpl,je, jmp等指令来实现switch功能,请再找出几组能生成跳转表与不生成跳转表的分支条件组合,并分析编译器在哪些情况下更有可能采用跳转表的方式来实现switch功能。同时考察不同的编译器是否有不同的行为。

