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

posted @ 2025-12-11 10:25  哼唧昂叽  阅读(3)  评论(0)    收藏  举报