当前位置:   article > 正文

湖南大学CS-2020期末考试解析_如下是一个 c 语言程序及其对应的汇编代码(32 位机,小端环境下编译),请参照汇编代

如下是一个 c 语言程序及其对应的汇编代码(32 位机,小端环境下编译),请参照汇编代

【特别注意】

答案来源于@甘晴void

是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。

【2024.6.11】更新最后一题第二问解释

【2024.6.11】纠正第4题的答案,并给出详细解释

感谢计科22@魏同学跑了程序,给出了严谨的佐证

【2024.6.17】纠正第1题(2)答案,给出第5题(3)详细解释

【试卷评析】

题目有典型性,有必要一做。

【试卷与答案】 

1.简答题(10 分)

假设一个基于 IEEE 浮点格式的 10 位浮点表示,有 1 个符号位,4 个阶码位(k=4)和 5 个尾数位(n=5)。
(1) 请给出值-6.125 的二进制位表示,并写出生成过程。
(2) 请写出正数中最大的非规格化数与最大的规格化数的二进制位表示。
(3) 在正整数中,有很多数字用题中的表示方式无法精确表示,其中最小的那个整数是多少(10 进制表示)?并简单分析原因。
【答案】 (第三个问题书上有详细的讨论,可以看一下书) 
第2题纠正错误,来自评论区。

2.程序填空题(20 分,每空 4 分)

如下是一个 c 语言程序及其对应的汇编代码( 32 位机,小端环境下编译),请参照汇编代码, 完成 c 程序的空缺部分。
c 语言程序:
  1. #include <stdio.h>
  2. #define A (1)
  3. #define B 113
  4. int array1[A][B];
  5. int array2[A];
  6. int test()
  7. {
  8. int sum= (2) ;
  9. int i=0;
  10. for(i=0;i<A;i++)
  11. {
  12. if( (3) ) continue;
  13. sum+= (4) ;
  14. }
  15. return (5) ;
  16. }
  17. int main()
  18. {
  19. return 0;
  20. }
汇编代码:
  1. test:
  2. pushl %ebp
  3. movl %esp, %ebp
  4. subl $16, %esp
  5. movl $5, -8(%ebp)
  6. movl $0, -4(%ebp)
  7. movl $0, -4(%ebp)
  8. jmp .L2
  9. .L6:
  10. movl -4(%ebp), %eax
  11. movl array2(,%eax,4), %eax
  12. cmpl $112, %eax
  13. jg .L7
  14. movl -4(%ebp), %eax
  15. movl array2(,%eax,4), %eax
  16. testl %eax, %eax
  17. jle .L7
  18. .L4:
  19. movl -4(%ebp), %eax
  20. movl array2(,%eax,4), %eax
  21. movl -4(%ebp), %edx
  22. imull $113, %edx, %edx
  23. addl %edx, %eax
  24. movl array1(,%eax,4), %eax
  25. addl %eax, -8(%ebp)
  26. jmp .L5
  27. .L7:
  28. nop
  29. .L5:
  30. addl $1, -4(%ebp)
  31. .L2:
  32. cmpl $54, -4(%ebp)
  33. jle .L6
  34. movl -8(%ebp), %eax
  35. imull -8(%ebp), %eax
  36. leave
  37. ret

【答案】

3.简答题(20 分,前面 4 空每空 4 分,后面 2 空每 空 2 分)

一段函数调用的 C 代码如下:
  1. #include”stdio.h”
  2. main()
  3. {
  4. int a=3,b=4,c=5,d=0;
  5. int *m= (1) , *n= (2) ;
  6. a=b+c;
  7. exch(m,n);
  8. d= (3) *2+ (4) *8; //填写变量名
  9. printf (“d=%d\n”, d);
  10. }
  11. int exch(int *xp, int *yp)
  12. {
  13. int j=*xp;
  14. int k=*yp;
  15. (5) ;
  16. (6) ;
  17. }

上述 C 代码执行完毕后栈帧如右图所示(每一格 4 字节),请将上面的 C 代码填写完整。

【答案】 

4.分析题(25 分)

32 Linux 系统中编写如下程序:

 相应.text 节内容如下(有部分省略):

1 )列举程序段中出现的符号,以及相应的属性( 本地、局部、外部 )以及存在于 ELF 哪一个节中; (蓝色部分当年在考场上修改为GLOBAL、EXTERNAL、LOCAL)
2 )简要说明重定位阶段链接器到底完成了哪些工作?并说明 .text 节如图所示出现了哪种类型的重定位,
3 )若已知重定位后 sweet 相应的 text 节起始地址为 0X080484b4 main 相应的 text节起始地址为 0X0804843b ,那么重定位的阶段最后要进行如下计算:
+ 0xfffffffc - + )得到一个值 a
请填写以上三个横线上的内容,并说明在可执行文件中 a 是多少?会出现在何处?
4 ) 请结合程序优化一章的内容,如果 n 值很大很大,考虑对 sweet.c 代码可以采用什么优化方法?并说明为什么优化了?同时分析其局限性。
【答案】 

【有误】符号表部分:

【正确符号表】:

符号属性哪一节符号属性哪一节
sweetExternUNDrExternUND
rGlobal.datasumGlobalCOMMON
xLocal.bsssweetGlobal.text
mainGlobal.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 分)

某计算机的主存地址空间大小为 256MB ,按字节编址。具有独立的指令和数据 cache ,每个均有 8 行,每一行数据块的大小为 64B 。数据 cache 采用 直接映射 方式。假设程序中定义了整型数组 int a[128][128] ,且 sizeof int =4 ,若编译时 i,j,sum ,使用标准 c 编译器,数组 a 在内存中存放的首地址为 400 (十进制数)。请作答:
1 )请给出该直接映射 cache 的主存地址划分;
2 )若考虑 cache 的有效位等额外存储空间,该数据 cache 实际总容量为多大?
3 )数组元素 a[1][0] 对应放置在哪一行 cache cache 行号从 0 开始编号)?

 【答案】 (这里的“行”有点绕,不过应该也好理解)

第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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/811253
推荐阅读
相关标签
  

闽ICP备14008679号