赞
踩
【特别注意】
答案来源于@甘晴void
是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。
【2024.6.11】更新最后一题第二问解释
【2024.6.11】纠正第4题的答案,并给出详细解释
感谢计科22@魏同学跑了程序,给出了严谨的佐证
【2024.6.17】纠正第1题(2)答案,给出第5题(3)详细解释
【试卷评析】
题目有典型性,有必要一做。
【试卷与答案】
- #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
【答案】
- #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 代码填写完整。
【答案】
相应.text 节内容如下(有部分省略):
【有误】符号表部分:
【正确符号表】:
符号 | 属性 | 哪一节 | 符号 | 属性 | 哪一节 |
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的区别,但是我们考试时要答出区别。
【答案】 (这里的“行”有点绕,不过应该也好理解)
第2题解释:
最后再乘8是因为有8行即这样的结构有8个。
即上图左边的式子(1+19+64*8)*8 = 4256 bit
第3题解释:(来自评论区)
a[1][0]地址为400+128*4=912;
则行为(912/64)%8= 6
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。