1、(1)考虑下面 这个for 循环的汇编代码looper:pushl %ebpmovl %esp, %ebpsubl $16, %espmovl $0, -8(%ebp)movl $0, -4(%ebp)jmp .L2.L4:movl -4(%ebp), %eaxsall $2, %eaxaddl 12(%ebp), %eaxmovl (%eax), %eaxcmpl -8(%ebp), %eaxjle .L3movl -4(%ebp), %eaxsall $2, %eaxaddl 12(%ebp), %eaxmovl (%eax), %eaxmovl %eax, -8(%ebp).L3:add
2、l $1, -8(%ebp)addl $2, -4(%ebp).L2:movl -4(%ebp), %eaxcmpl 8(%ebp), %eaxjl .L4movl -8(%ebp), %eaxleaveret根据以上的汇编代码,完成相应的for循环C程序代码( 注意该程序有返回值)。int looper(int n, int *a)int i;int x=0;for(i= 0 ; ix)/2分 x=ai;/ 2分 x+;/1分_return x;/ 1分(2)根据已有的结构(structure)和联合(union)的声明以及 C函数void test(int i, s2 *bp)的IA32
3、汇编代码,推断出 结构s1的完整声明和s2中CNT的值;之后再根据推断结果以及IA32 汇编代码,推断补齐相应的C程序代码。下面是要使用到的结构和联合的声明,函数void test(int i, s2 *bp)及其IA32 汇编代码。struct s1 struct s2 union u1 int left; struct s1 *h;s1 aCNT; struct s2 *i;int right; char j; union u1 b; ;char c;void test(int i, s2 *bp)int n=bp-left+bp-right;s1 *ap=ap-xap-idx=n;其IA
4、32汇编代码为:test:pushl %ebpmovl %esp, %ebpsubl $16, %espmovl 12(%ebp), %eaxmovl (%eax), %edxmovl 12(%ebp), %eaxmovl 184(%eax), %eaxleal (%edx,%eax), %eaxmovl %eax, -4(%ebp)movl 12(%ebp), %eaxleal 4(%eax), %ecxmovl 8(%ebp), %edxmovl %edx, %eaxsall $2, %eaxaddl %edx, %eaxsall $2, %eaxleal (%ecx,%eax), %ea
5、xmovl %eax, -8(%ebp)movl -8(%ebp), %eaxmovl (%eax), %edxmovl -8(%ebp), %eaxmovl -4(%ebp), %ecxmovl %ecx, 4(%eax,%edx,4)leaveret1. CNT=_9_/2分2. 写出s1的完整声明。_struct s1 int idx;/2分 int x4;/2分 _3. 对于下面左边的每个IA32 汇编代码,请在右边补 全相应的C程序代码。 (请注意下面的函数都需要返回值)A. proc1:pushl %ebpmovl %esp, %ebpmovl 8(%ebp), %eaxmovzb
6、l 188(%eax), %eaxpopl %ebpretchar proc1(struct s2 *x)_return x-b.j;(4分)_B. proc2:pushl %ebpmovl %esp, %ebpsubl $16, %espmovl 8(%ebp), %eaxmovl 188(%eax), %eaxmovl (%eax), %eaxmovl %eax, -4(%ebp)movl 8(%ebp), %eaxmovl 188(%eax), %eaxmovl 184(%eax), %eaxaddl %eax, -4(%ebp)movl -4(%ebp), %eaxleaveretC.
7、 proc3:pushl %ebpmovl %esp, %ebpsubl $16, %espmovl 8(%ebp), %eaxmovl (%eax), %eaxmovl 188(%eax), %eaxmovzbl 192(%eax), %eaxmovb %al, -1(%ebp)movl 8(%ebp), %eaxmovl (%eax), %eaxmovzbl 188(%eax), %eaxandb %al, -1(%ebp)movzbl -1(%ebp), %eaxleaveretint proc2(struct s2 *x)_int a = x-b.i-left;/2分 a += x-b
8、.i-right;/3分return a;(3分)_char proc3(union u1 *x)_char a = x-i-b.i-c;/2分 a (3分)_(3)Pentium III的算术操作性能如下:操作 执行时间 发射时间整数加法 1 1整数乘法 4 1整数除法 36 36浮点加法 3 1浮点乘法 5 2浮点除法 38 38加载或存储(高速缓存命中) 1 1考虑如下程序:int loop(int *a, int x, int n)int y=x*x;int i;for(i=0;i0)counter+;while (waitpid(-1,return counter;counter+=
9、i;return counter;int main()printf(“counter =%dn“, count();exit(0);问:1. 程序是否总是有相同 输出?是/6分2. 如果第一问答案为”是”,给出此固定输出, 如果答案为” 否”, 则列出所有可能输出。counter7counter7counter5/4分(5)请写出一段代 码,父进程利用fork()函数创建一个子进程之后挂起,子进程什么也不做,睡眠5s后通过kill函数发送SIGALRM 信号给父进程,再睡眠3s,然后以状态1 退出。父进程在信号处理程序中,回收子进程,打印子进程的退出状态,之后以状态0退出。注意程序中用到的系
10、统调用函数不必进行错误检查,用到的头文件已经给出。#include #include #include #include #include void handler(int sig)int status;waitpid(-1,printf(“%dn“,WEXITSTATUS(status);exit(0);int main()pid_t pid;signal(SIGALRM, handler);if(fork()=0)pid=getppid();sleep(5);kill(pid,SIGALRM);sleep(3);exit(1);pause();sigal()-handler()2分fork
11、() 1分kill()1分waitpid() 1分sleep() 1分WEXITSTATUS 1分exit() 1分程序结构 2分(6)下面这个问题考察你如何将虚拟地址翻译成物理地址。我们做出如下假设:这个存储器是按字节寻址的;存储器访问是针对1字节的字的(不是4字节的字);虚拟地址是16位长的;物理地址是13位长的;页面大小是1024字节;TLB 是八路组相联,总共16个条目;缓存是物理寻址、直接映射的,行大小为4字节,2路相联总共16个组。在下面的表格中,所有的数字均为16进制。TLB 的内容和页表的前32页如下:Page TableVPN PPN Valid VPN PPN ValidT
12、LBIndex Tag PPN Valid009 4 112 2 110 0 103 5 105 7 113 1 010 3 018 3 0104 1 00C 1 012 0 008 1 006 7 003 1 007 5 002 2 000 6 101 5 002 3 103 4 104 2 005 7 106 1 007 3 008 5 109 4 00A 3 00B 2 00C 5 00D 6 00E 1 10F 0 010 0 111 5 012 2 113 4 014 6 015 2 016 4 017 6 018 1 119 2 01A 5 01B 7 01C 6 01D 2 01
13、E 3 01F 1 01. (1) 下面需要你描述虚拟地址的格式。请在表格下方标注出下列符号的表示范围。如果其中有符号在本题中不需要用到,请不要标注。VPO 虚拟页面偏移VPN 虚拟页号TLBI TLB 索引号TLBT TLB 标记15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 02-way Set Associative CacheIndex Tag Valid Byte0 1 2 3 Tag Valid Byte0 1 2 30123456719 115 01B 106 007 00D 111 016 199 11 23 114F 22 EC 1100 02 04
14、0884 06 B2 9C43 6D 8F 0936 32 00 78A2 37 68 3111 C2 11 3300 02F 10B 112 005 01E 100 11E 199 11 23 1155 59 0B 4101 03 05 0784 06 B2 9C43 6D 8F 09A1 B2 C4 DEBB 77 33 0000 C0 0F 00VPN: 15-10 VPO: 9-0/2分TLBT: 15-11 TLBI: 10/1分(2) 下面需要你描述物理地址的格式。请在表格下方标注下列符号的表示范围。PPO 物理页面偏移PPN 物理页号CO 缓冲块内的字节偏移量CI 高速缓存索引C
15、T 高速缓存标记12 11 10 9 8 7 6 5 4 3 2 1 0PPN: 12-10PPO: 9-0/2分CT: 12-5 CI: 4-2 CO: 1-0/2分2. 对于给定的虚 拟地址,请你指出被访问的 TLB 条目,相对应的物理地址,以及返回的高速缓存字节值(用16进制表示)。并且请指出是否发生了 LTB 不命中,是否发生了缺页,是否发生缓存不命中。如果 发生缓存不命中,在 “返回的缓存字节”一栏中填 “-”。如果发生缺页,在 “PPN”栏中填入“-”并且空着 C 和 D 部分。(1) 虚拟地址 : 0x81B6A. 虚拟地址格式(每格填一个 bit)15 14 13 12 11
16、10 9 8 7 6 5 4 3 2 1 0/1分1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0B. 地址翻 译 /各1分参数 值VPN 0x20 TLB索引 0x0 TLB标记 0x10 TLB命中?(Y/N) Y 缺页?(Y/N) N PPN 0x0 C. 物理地址格式(每格填一个 bit)/1分12 11 10 9 8 7 6 5 4 3 2 1 00 0 0 0 1 1 0 1 1 0 1 1 0D. 物理存储器引用 /各1分 参数 值字节偏移 0x2 缓存索引 0x5缓存标记 0x0D缓存命中?(Y/N) Y 返回的缓存字节 0x00第七题1. 双层循环/10分,2. /10分算法改进/5 分循环展开等方法 /5分