ICS 2023 期终考试试卷
一
1
尽量写详细一些,不然不好给分。
2
计算 offset=(4+1024)*4,然后加上首地址即可计算真实地址,存储单元内容注意用小端表达。
2.5
这个题目需要把所以汇编代码都分析清楚,因此一句句模拟即可。
a: 55 push %ebp
b: 89 e5 mov %esp,%ebp
d: 51 push %ecx
e: 83 ec 14 sub $0x14,%esp
11: e8 fc ff ff ff call 12 <main+0x12> //不影响栈帧,不用看
16: d9 05 00 80 00 00 flds 0x8000 //把 a[0x2000] 放入浮点数栈
1c: d9 5d f4 fstps -0xc(%ebp) //pop浮点数栈顶,放入局部变量
1f: d9 45 f4 flds -0xc(%ebp) //把局部变量入栈
22: 83 ec 04 sub $0x4,%esp //栈顶往下推 4
25: 8d 64 24 f8 lea -0x8(%esp),%esp //往下推 8,不知道为什么这里用 lea
29: dd 1c 24 fstpl (%esp) //把浮点数栈栈顶放到 %esp 的位置,放入参数 f
2c: 68 00 00 00 00 push $0x0 //放入参数格式化字符串地址
31: e8 fc ff ff ff call 32 <main+0x32> //放入返回地址,
36: 83 c4 10 add $0x10,%esp
39: b8 00 00 00 00 mov $0x0,%eax
3e: 8b 4d fc mov -0x4(%ebp),%ecx
3
只要查看机器值,和汇编指令真值是否不一样,例如地址 26 的指令:
66 0d 00 c0 or $0xc000, %ax
这里,00 c0 显然就是 0xc000 的小端表示。
4
从 test.o 的内容反过来对应 test.c,可以知道从 0x24 到 0x33 是对应的指令。
5
根据 ALU 的构造,指令 cmp 就是做一个运算并设置 FLAGS,因此就是 OF, SF, ZF, CF 这些标志寄存器。
需要注意 OF=Cn xor Cn-1, CF=Cn xor C[in],这两个比较难记。
6
jle 是局部跳转,pc - 0xbb = dst
7
看看 f 的值会是多少?
ar[0x2000] = ar[8][0]
而 ar[8][0].n1 = 0, ar[8][0].n2 = 0xc008,因此 ar[0x2000] = 0xc0080000,然后用 float 的方法解析这个机器数。
最终结果是 -2.125,有空自己练习一下
二
1
没初始化,就是 .bss 节;可读写数据段;占据 102410244 字节;强符号弱符号
2
11 地址的 call 指令要调函数 test,第一个要重定位的:
(引用偏移量,符号名,重定位类型) = (0x12, test, R_386_PC32)
16 地址的 flds 指令,调用 ar 数组:
(0x18, ar, R_386_32)
2c 地址的 push 指令放格式字符串,.rodata 的起始地址:
(0x2d, .rodata, R_386_32)
31 地址的 call 指令调 printf:
(0x32, printf, R_386_32)
三
1
要计算发生缺页异常,就看看哪里进行了访存,再看每个访存结果是否会缺页。
取指令会访问,取数据也会。
第一次取指令不会缺页!,因为比如前面的 main 函数已经弄过了!真是太阴险了!后面也不会缺页。然后也没有调用函数,因此只有这些指令了。
取数据就是访问 ar[...],一共有 4MB 字节的空间,也就是 1024 页,同时由于起始虚拟地址并非整数,因此会访问 1025 个页,从 0x804c... -> 0x844c...,0x80491a1 在这个之前,因此每个页面都会缺页。但是如果头尾已经访问过,就需要细致的讨论,但总之中间 1023 个一定缺页。
2
虚拟数组超出合法访存范围了,因此就会寄掉
四
1
一个主存块是 64Bytes,8 路组相连,因此 16KB / 64 / 8 就是 32 组。
把一个物理地址分为如下
[tag,索引][5位,组的索引][6位,块内偏移]
2
计算 cache 缺失率需要看访问模式。数组按照行优先的方式存储,因此 i=0, j=0..1023 是连续存储的。
j=0...1023 分为多个 64B,64B/4=16 个数组元素,访问第一个元素会缺失,一共会访问 16*2(n1, n2)=32 次,因此缺失率位 1/32=3.125%
3
按照列有限的方式访问数组。模拟一下访问的过程。
j 确定时,每次访问会跨越 1024 个数组元素,n1, n2 会有 1024 * 2 = 2048 次访存。
相邻的访问跨越的地址空间是 4*1024=2^12,即地址的低 12 bit 总不变,即组和块内偏移总不变。前 8 个会放到 8 组,后面每次都会替换,因此 1024 - 8 = 1016 次替换。
缺失率有 50%,因为 n1 会缺失,而 n2 不会。
五
空洞访问,IDT 表,GDT 表,啊反正要写 300 字,俺也不知道。
选择题
CDCAC DBACB

浙公网安备 33010602011771号