【特别注意】
答案来源于@甘晴void
是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。
【2024.6.11】更新最后一题第二问解释
【2024.6.11】纠正第4题的答案,并给出详细解释
感谢计科22@魏同学跑了程序,给出了严谨的佐证
【2024.6.17】纠正第1题(2)答案,给出第5题(3)详细解释
【试卷评析】
题目有典型性,有必要一做。
【试卷与答案】
1.简答题(10 分)
![](https://img-blog.csdnimg.cn/direct/65fa877d6af74b98afdb1bfc80939aae.png)
2.程序填空题(20 分,每空 4 分)
#include <stdio.h>
#define A (1)
#define B 113
int array1[A][B];
int array2[A];
int test()
{
int sum= (2) ;
int i=0;
for(i=0;i<A;i++)
{
if( (3) ) continue;
sum+= (4) ;
}
return (5) ;
}
int main()
{
return 0;
}
test:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $5, -8(%ebp)
movl $0, -4(%ebp)
movl $0, -4(%ebp)
jmp .L2
.L6:
movl -4(%ebp), %eax
movl array2(,%eax,4), %eax
cmpl $112, %eax
jg .L7
movl -4(%ebp), %eax
movl array2(,%eax,4), %eax
testl %eax, %eax
jle .L7
.L4:
movl -4(%ebp), %eax
movl array2(,%eax,4), %eax
movl -4(%ebp), %edx
imull $113, %edx, %edx
addl %edx, %eax
movl array1(,%eax,4), %eax
addl %eax, -8(%ebp)
jmp .L5
.L7:
nop
.L5:
addl $1, -4(%ebp)
.L2:
cmpl $54, -4(%ebp)
jle .L6
movl -8(%ebp), %eax
imull -8(%ebp), %eax
leave
ret
【答案】
3.简答题(20 分,前面 4 空每空 4 分,后面 2 空每 空 2 分)
#include”stdio.h”
main()
{
int a=3,b=4,c=5,d=0;
int *m= (1) , *n= (2) ;
a=b+c;
exch(m,n);
d= (3) *2+ (4) *8; //填写变量名
printf (“d=%d\n”, d);
}
int exch(int *xp, int *yp)
{
int j=*xp;
int k=*yp;
(5) ;
(6) ;
}
上述 C 代码执行完毕后栈帧如右图所示(每一格 4 字节),请将上面的 C 代码填写完整。
【答案】
4.分析题(25 分)
![](https://img-blog.csdnimg.cn/ffe499b8bc174be3a375fa99386c8dc8.png)
相应.text 节内容如下(有部分省略):
![](https://img-blog.csdnimg.cn/e4dc8f9a2cff4d24beb41c9cc070fb28.png)
![](https://img-blog.csdnimg.cn/b3d043ae52d4447a9a8204acb37c632d.png)
【有误】符号表部分:
【正确符号表】:
符号 | 属性 | 哪一节 | 符号 | 属性 | 哪一节 |
sweet | Extern | UND | r | Extern | UND |
r | Global | .data | sum | Global | COMMON |
x | Local | .bss | sweet | Global | .text |
main | Global | .text |
sweet函数在sweet.c中定义,在main.c中只是被声明,声明是没用的,所以还是外部的。
关于.bss和COMMON,书上给出了现代版本GCC的执行规则:
sum属于未被初始化的全局变量,故为COMMON。
程序验证:
感谢计科22@魏同学跑了程序,给出了严谨的佐证如下:
sweet.c
main.c
数字所对应的,如2对应.text,5对应.bss等,都可以找到对应,与表格一致。
GCC未显示Extern和Global的区别,但是我们考试时要答出区别。
5.分析题(25 分)
【答案】 (这里的“行”有点绕,不过应该也好理解)
第2题解释:
- 有效位1bit
- 标记位19bit(共28位,块内偏移6位,组索引3位,标记位19位)
- 数据2^6,但是是字节编址,所以要乘8,就是2^6 * 8 bit
最后再乘8是因为有8行即这样的结构有8个。
即上图左边的式子(1+19+64*8)*8 = 4256 bit
第3题解释:(来自评论区)
a[1][0]地址为400+128*4=912;
则行为(912/64)%8= 6