装
订
线
内
不
要
答
题
北京大学信息科学技术学院考试试卷
考试科目:计算机系统导论 姓名: 学号:
考试时间: 2016 年 11 月 07 日 小班教师:
总分
题号 一 二 三 四 五
分数
阅卷人
1、考生进入考场后,按照监考老师安排隔位就座,将学生证放在桌面上。
无学生证者不能参加考试;迟到超过 15 分钟不得入场。在考试开始 30 分钟后
方可交卷出场。
2、除必要的文具和主考教师允许的工具书、参考书、计算器以外,其它
所有物品(包括空白纸张、手机、或有存储、编程、查询功能的电子用品等)
不得带入座位,已经带入考场的必须放在监考人员指定的位置。
北京大学考场纪律
以下以下为答题纸,共 页
3、考试使用的试题、答卷、草稿纸由监考人员统一发放,考试结束时收
回,一律不准带出考场。若有试题印制问题请向监考教师提出,不得向其他考
生询问。提前答完试卷,应举手示意请监考人员收卷后方可离开;交卷后不得
在考场内逗留或在附近高声交谈。未交卷擅自离开考场,不得重新进入考场答
卷。考试结束时间到,考生立即停止答卷,在座位上等待监考人员收卷清点后,
方可离场。
4、考生要严格遵守考场规则,在规定时间内独立完成答卷。不准交头接
耳,不准偷看、夹带、抄袭或者有意让他人抄袭答题内容,不准接传答案或者
试卷等。凡有违纪作弊者,一经发现,当场取消其考试资格,并根据《北京大
学本科考试工作与学术规范条例》及相关规定严肃处理。
5、考生须确认自己填写的个人信息真实、准确,并承担信息填写错误带
来的一切责任与后果。
学的学术声誉。
以下为试题和答题纸,共 12 页。
学校倡议所有考生以北京大学学生的荣誉与诚信答卷,共同维护北京大
1
得分
第一题 单项选择题和填空题(每小题 1 分,共 20 分)
注:选择题的回答填写在下表中,填空题的回答填写在题目提供的空格中。
1
题号
回答
题号 11
回答
2
12
3
13
7
17
/
8
18
/
9
19
/
4
14
5
15
/
6
16
/
10
20
/
addq $1, %rdi
cmpq $8, %rdi
ja .L2
jmp *.L4(, %rdi, 8)
.L4:
2
.quad .L9 .quad .L5 .quad .L6 .quad .L7 .quad .L2
D. shl $1,%ax
B. jc NEXT
C. inc %bx
1. 在下列指令中,其执行会影响条件码中的 CF 位的是:
A. jmp NEXT
2. 下列关于比较指令 CMP 说法中,正确的是:
A. 专用于有符号数比较
C. 专用于串比较
3. 在如下代码段的跳转指令中,目的地址是:
400020: 74 F0
400022: 5d
je ________
pop %rbp
B. 专用于无符号数比较
D. 不区分比较的对象是有符号数还是无符号数
B. 400012
A. 400010
4. 对于如下的 C 语言中的条件转移指令,它所对应的汇编代码中至少包含几条条
件转移指令:if (a > 0 && a != 1 || a < 0 && a != -1) b=a;
C. 400110
D. 400112
D. 5 条
C. 4 条
B. 3 条
A. 2 条
5. 将 AX 清零,下列指令错误的是:
A. sub %ax, %ax
C. test %ax, %ax
6. 在如下 switch 语句对应的跳转表中,哪些标号没有出现在分支中?
B. xor %ax, %ax
D. and $0, %ax
.quad.L7
.quad .L8
.quad .L2
C. 0, 7
.quad .L5
D. 2, 4
A. 3, 6
7. 已知短整型数组 S 的起始地址和下标 i 分别存放在寄存器%rdx 和%rcx,将
B. -1, 4
&S[i]存放在寄存器%rax 中所对应的汇编代码是:
A. leaq (%rdx, %rcx, 1), %rax
B. movw (%rdx, %rcx, 2), %rax
C. leaq (%rdx, %rcx, 2), %rax
D. movw (%rdx, %rcx, 1), %rax
8. 下面对指令系统的描述中,错误的是:
A. CISC 指令系统中的指令数目较多,有些指令的执行周期很长;而 RISC 指令
系统中通常指令数目较少,指令的执行周期都较短。
B. CISC 指令系统中的指令编码长度不固定;RISC 指令系统中的指令编码长度固
定,这样使得 CISC 机器可以获得了更短的代码长度。
C. CISC 指令系统支持多种寻址方式,RISC 指令系统支持的寻址方式较少。
D. CISC 机器中的寄存器数目较少,函数参数必须通过栈来进行传递;RISC 机器
中的寄存器数目较多,只需要通过寄存器来传递参数,避免了不必要的存储访问。
9. 下面对流水线技术的描述,正确的是:
A. 流水线技术不仅能够提高执行指令的吞吐率,还能减少单条指令的执行时间。
B. 不断加深流水线级数,总能获得性能上的提升。
C. 流水级划分应尽量均衡,吞吐率会受到最慢的流水级影响。
D. 指令间的数据相关可能会引发流水线停顿,但总是可以通过调度指令来解决。
10. 对应下述组合电路的正确 HCL 表达式为:
A. Bool eq = ( a or b ) and ( !a or !b )
B. Bool eq = ( a and b) or ( !a and !b )
C. Bool eq = ( a or !b ) and ( !a or b )
D. Bool eq = ( a and !b ) or ( !a and b )
3
11. 流水线数据通路中的转移预测策略为总是预测跳转。如果转移预测错误,需要
恢复流水线,并从正确的目标地址开始取值。其中,用来判断转移预测是否正
确的信号是_①_和_②__,用来获得正确的目标地址的信号是_③_。
A.① M_icode ② M_Bch ③ M_valA
B.① W_icode ② M_Bch ③ M_valA
C.① W_icode ② M_Bch ③ W_valM
D.① M_icode ② M_Bch ③ W_valM
12. 若处理器实现了三级流水线,每一级流水线实际需要的运行时间分别为 1ns、
2ns 和 3ns,则此处理器不停顿地执行完毕 10 条指令需要的时间为:
A. 21 ns B. 12 ns C. 24 ns D. 36 ns
13. 以下关于存储结构的讨论,那个是正确的:
A. 增加额外一级存储,数据存取的延时一定不会下降
B. 增加存储的容量,数据存取的延时一定不会下降
C. 增加额外一级存储,数据存取的延时一定不会增加
D. 以上选项都不正确
4
14. 关于局部性(locality)的描述,不正确的是:
A. 循环通常具有很好的时间局部性
B. 循环通常具有很好的空间局部性
C. 数组通常具有很好的时间局部性
D. 数组通常具有很好的空间局部性
15. 假定编译器规定 int 和 short 型长度分别为 32 位和 16 位,执行下列语句:
unsigned short x = 65530;
unsigned int y = x;
得到 y 的机器数为___________。(用 16 进制表示,勿省略前导的 0)
16. 一个 C 语言程序在一台 32 位机器上运行。程序中定义了三个变量 x、y 和 z,
其中 x 和 z 为 int 型,y 为 short 型。当 x=127,y=-9 时,执行赋值语句
z=x+y 后,z 的值是__________(用 16 进制表示,勿省略前导的 0)
17. 若按 IEEE 浮点标准的单精度浮点数(符号位 1 位,阶码字段 exp 占据 8 位,
小数字段 frac 占据 23 位)表示-8.25,结果是__________(用 16 进制
表示)
18. 若我们采用基于 IEEE 浮点格式的浮点数表示方法,阶码字段 exp 占据 k 位,
小数字段 frac 占据 n 位,则最大的非规格的正数是__________(结果用含
有 n,k 的表达式表示)
19. 如果直接映射高速缓存大小是 32KB,并且块(block)大小为 32 字节,那
么它每组(set)有 行(line)。
20. 如果二路组相联高速缓存大小是 8KB,并且块(block)大小为 32 字节,那
么它每路(way)有 行(line)。
5
得分
第二题(20 分)
1.在 64 位机器上,判断下列等式是否恒成立
/* random_int()函数返回一个随机的 int 类型值 */
int x = random_int();
int y = random_int();
int z = random_int();
unsigned ux = (unsigned)x;
long lx = (long)x; /* long 为 64 位 */
long ly = (long)y;
double dx = (double)x;
double dy = (double)y;
double dz = (double)z;
Expression
(x >= 0) || (3*x < 0)
(x >= 0) || (x < ux)
((x >> 1) << 1) <= x
Always True?
Y N
Y N
Y N
Y N
Y N
Y N
Y N
Y N
((x-y)<<3) + (x>>1) - y == 8*x - 9*y + x/2
(x - y > 0) == ((y+~x+1)>>31 == 1)
dx + dy == (double) (y+x)
dx + dy + dz == dz + dy + dx
(int)((lx+ly)>>1) == ((x&y) +
((x^y)>>1))
2. 假设 C 语言中新定义了一种数据类型 T,该类型为 12-bit 长的浮点数,此浮
点数遵循 IEEE 浮点数格式,其字段划分如下:
符号位(s):1-bit;阶码字段(exp):6-bit;小数字段(frac):5-bit。
1) 若将该格式下能表示的所有正规格数从小到大依次排列,则
相邻两数之间差值的最小值为_________,最大值为_________
2) 现定义了如下变量:
T a = -15.875;
T b = (1<<28) + (1<<24) + (1<<22);
T c = a*b;
请写出各变量的二进制表示:
二进制表示
变量
a
b
c
6
得分
第三题(20 分)
(1) 观察下面C语言函数和它相应的X86-64汇编代码
int foo(int x, int i)
{
switch(i)
{
case 1:
x -= 10;
case 2:
x *= 8;
break;
case 3:
x += 5;
case 5:
x /= 2;
break;
case 0:
x &= 1;
default:
x += i;
}
return x;
}
00000000004004a8 :
4004a8: mov %edi,%edx
4004aa: cmp $0x5,%esi
4004ad: ja 4004d4
4004af: mov %esi,%eax
4004b1: jmpq *0x400690(,%rax,8)
4004b8: sub $0xa,%edx
4004bb: shl $0x3,%edx
4004be: jmp 4004d6
4004c0: add $0x5,%edx
4004c3: mov %edx,%eax
4004c5: shr $0x1f,%eax
4004c8: lea (%rdx,%rax,1),%eax
4004cb: mov %eax,%edx
4004cd: sar %edx
4004cf: jmp 4004d6
4004d1: and $0x1,%edx
4004d4: add %esi,%edx
4004d6: mov %edx,%eax
4004d8: retq
调用gdb命令x/kg $rsp 将会检查从rsp中的地址开始的k个8字节字,请填写下
面gdb命令的输出(每空一分)。
>(gdb) x/6g 0x400690
7
0x400690: 0x__________________ 0x__________________
0x4006a0: 0x__________________ 0x__________________
0x4006b0: 0x__________________ 0x__________________
(2) 右边的汇编代码是由左边程序中的 m 函数编译而成。回答如下问题。
typedef struct _list {
struct _list* next;
int value;
} list;
int m(list* p) {
int r = 100;
while (__○1 __) {
r = __○2 __;
p = __○3 __;
}
if (p != 0) r = __○4 __;
return r;
}
m:
.L14:
.L4:
.L3:
.L6:
testq %rdi, %rdi
je .L6
movq (%rdi), %rdx
movl $100, %eax
testq %rdx, %rdx
jne .L4
jmp .L3
movq (%rdi), %rdx
testq %rdx, %rdx
je .L3
movl 8(%rdx), %r8d
__○5 __ 8(%rdi), %r8d
__○5 __ %r8d, %eax
movq (%rdx), %rdi
testq %rdi, %rdi
jne .L14
ret
__○5 __ 8(%rdi), %eax
ret
movl $100, %eax
ret
已知访存延迟 1 个指令周期。不访存的时候 addl 延迟 4 个指令周期,imull 延
迟 8 个指令周期,其他指令延迟 1 个指令周期。指令访存时延迟的执行周期为不
访存的时候延迟的指令周期和访存延迟的周期之和。函数 m 中的循环在处理链表 p
的时候 CPE 为 4 个指令周期。○5 处的指令为 movl, addl, imull 中的一个。请
填写○1 -○5 处的代码。
○1
○2
○3
○4
○5
8