湖南大学CS-2020期末考试解析

【特别注意】

答案来源于@甘晴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 语言程序:
#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 分)

一段函数调用的 C 代码如下:
#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 分)

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

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值