如果不扣分的话,总分:13分,因为最高只能得10分所以是10分
选题:3.63
分值:两分
作业过程:
int sum_col(int n,int A[E1(n)][E2(n)],int j) { int i; int result = 0; for(i=0;i<E1(n);i++) result += A[i][j]; return result; }
上面是原来的代码
汇编代码
movl 8(%ebp),%edx ;edx:n leal (%edx,%edx),%eax ;eax:2n leal -1(%eax),%ecx ;ecx:2n-1 leal (%eax,%edx),%esi ;esi:3n,(E1(n)) movl $0,%eax ;eax: 0(result) testl %esi,%esi ;检验esi(正\负\0) jle .L3 ;若esi中E1(n)≤0的话,跳转 leal 0(,%ecx,4),%ebx ;ebx:0+4*ecx=4(2n-1) movl 16(%ebp),%eax ;eax:ebp+16(j的地址) movl 12(%ebp),%edx ;edx:ebp+12(A[i]的地址) leal (%edx,%eax,4),%ecx ;ecx:edx+4*eax(A[i][j]) movl $0,%edx ;edx:0 movl $0,%eax ;eax: 0 .L4 ;loop addl (%ecx),%eax ;eax+=ecx((A[i][j]的地址) addl $1,%edx ;edx:edx+1(i) addl %ebx,%ecx ;ecx:ecx+ebx(ecx:A[i+1][j]) cmpl %esi,%edx ;比较esi与edx(E1(n)与i的比较) jl .L4 ;如果i<E1(n),跳转,回到循环 .L3 ;
E1(n)存储在esi中,E1(n)=3n;
E2(n)存储在ebx中,ebx=4*E2(n),所以E2(n)=2n-1.
选题:6.31
分值:一分
作业过程:
A.E=4,B=4,S=8
所以C=E*B*S=128
B.
选题:6.32(和20135236合作,得一分)
分值:两分
作业过程:
由题6.31可得:
块偏移位数量b=2 ==>CO
组索引位数量s=3 ==>CI
标记位数量t=8 ==>CT
接着把0x0718化成二进制得到0000011100011000,然后按顺序填入地址中:
索引位为6,高速缓存示记为38,所以可以看6.31的图索引位为6的那一行,有两个38的标记位,所以缓存示命中的。但是第一个的状态是0所以命中的是后面的FA
选题:6.42
分值:两分
作业过程:
读总数为2912
不命中的读总数为728
不命中率为25%
选题:8.20
分值:两分
作业过程:
程序myls的代码如下(行为与/bin/ls的行为一样,要注意环境变量):
int main(int argc,char* args[]) { execve("/bin/ls",args,environ); return 0; }
选题:8.25
分值:三分
作业过程:
fgets定义:
char *fgets(char *buf,int bufsize,FILE *stream);
*buf:字符型指针,指向用来存储所得数据的地址
bufsize:整型数据,指明buf指向的字符数组大小
*stream:文件结构体指针,将要读取的文件流
tfgets一开始调用fgets,如果5秒到了fgets还没有返回,就需要通过非本地跳转让tfgets返回NULL
代码如下:
(前面的include部分就不写了)
sigjum_buf env; void tfgets_handler(int sig){ signal(SIGALRM,SIG_DFL); siglongjmp(env,1); } char *tfgets(char *buf,int bufsize,FILE *stream){ static const int TimeLimitSecs = 5; signal(SIGALRM,tfgets_handler) alarm(TimeLimitSecs); int rc = sigsetjum(env,1); if(rc == 0 ) return fgets(buf,bufsize,stream); else return NULL; }
选题:12.18
分值:一分
作业过程:
图12-21如图
A.如图,所以不安全
B.如图,所以安全
C.如图,所以不安全
选题:12.28
分值:一分
作业过程:
情况1:如图,会产生一个死锁区
情况2:如图,对死锁没有影响
情况3:如图,对死锁没有影响
情况4:如图,对死锁没有影响