计算机系统课程作业

2023-02-22 14:28:13 浏览数 (1)

小班讨论

这是本人自己做的小班讨论的题目,放在了 ,里面还包含有部分操作系统导论的代码。

其中第几次小班讨论以英文字母区分,如第一次就是first.

没有传的就是我没做的

GitHub

课程作业

第一次课程作业网上容易找到答案,我就不放了。

第二次课程作业:

简单的放点题目:

第一题

有如下c语言程序,其中的H和J定义为一个常数。

代码语言:javascript复制
# include "stdio.h"# define H ?  //定义常数H# define J ?  //定义常数Jint array1[H][J]; int array2[J][H]; void f(int x, int y) {array1[x][y] = x 2*y;array2[y][x]=y-x*x;}int main( ){return 0;}

我的解答:

代码语言:javascript复制
一、H=37,J=16pushl �p 前两行压程序栈movl %esp,�ppush �x 压 f 函数栈movl 8(�p), �x 赋值 xmovl 12(�p), �x 赋值 ymovl 12(�p), �x 赋值 yaddl �x, �x eax 自增为 2 倍(2y)addl 8(�p), �x eax=eax ecx x 2*ysall $4, �x ecx 的值左移 4 位 x*16leal (�x,�x), �x 把 ecx edx 的地址给 edx x*16 y 即 x 的系数 J=16movl �x, array1(,�x,4) 把 eax 的值给 array1 的 edx* 4 位的地方 4*(x* 16 y)的地方=x 2* y,即 array1[x][y]=x 2*ymovl 12(�p), �x 赋值 ymovl 8(�p), �x 赋值 xmovl 8(�p), �x 赋值 ximull 8(�p), �x eax=eax* eax x*xmovl 12(�p), �x ecx=edx ecx 处=ysubl �x, �x ecx=ecx-eax y-x*xmovl �x, �x eax=edx eax 处=ysall $3, �x eax < < 3 相当于y < < 3 3 即是 J 的值addl �x, �x eax=eax edx y< <3 ysall $2, �x eax< <2 (y< <3 y)< <2addl �x, �x eax=edx eax (y< <3 y)< <2 yaddl �x, �x eax=eax ebx (y< <3 y)< <2 y x 即 y 的系数 H=(8 1)*4 1=37movl �x, array2(,�x,4) 把 array2 的 4* eax 的地方赋值为 ecx 即 array2 的 4*eax 的地方=y-x *x 即 array2[x][y]=y-x*xpopl �x 出函数栈popl �p 出栈ret 结束程序

第二题

如下为一个c语言程序中的函数及其在32位系统下编译得到的汇编语言程序代码,请详细说明每条汇编语句的意义,并将这个函数补充完整。

我的解答:

代码语言:javascript复制
二、int aprod(int a[], int n) {int i, x, y, z;int r = 1;for (i = 0; ( i< n-2  ); (  i =3  )) {(  x=a[i]  );(  y=a[i 1]  );(  z=a[i 2]  );(  r=r*x*y*z*  ); }    for (; i < n; i  )       (  r=a[i]*r  );    return r;}

代码语言:javascript复制
汇编分析:aprod:pushl �p //前两行压栈movl %esp, �p //栈帧subl $32, %esp //esp-32movl $1, -20(�p)   //ebp小20的位置放1  r=1movl $0, -4(�p)    //ebp小4的位置放0   i=0jmp.L2      //无条件跳转到.L2.L3:movl -4(�p), �x   //eax=0=isall $2, �x      //eax=0*4=0addl 8(�p), �x  //eax加上ebp大8的位置,即eax =a[]movl (�x), �x  //eax=a[i]movl �x, -8(�p)  //ebp小8的地方赋值为eax   x=a[i] movl -4(�p), �x   //eax=i=0addl $1, �x      //eax=i 1=1,sall $2, �x     //eax=4addl 8(�p), �x  //eax加上ebp大8的位置 eax=4 a[]movl (�x), �x   //eax=a[i 1]movl �x, -12(�p)   //ebp小12的位置变为eax   y=a[i 1]movl -4(�p), �x    //eax=ebp小4的位置   eax=i=0addl $2, �x      //eax =2 eax=2sall $2, �x     //eax*=4  eax=8addl 8(�p), �x   //eax ebp大8的位置 eax=8 a[]movl (�x), �x    //eax=a[i 2]movl �x, -16(�p)   //ebp小16的位置放eax     z=eax=a[i 2]movl -20(�p), �x  //eax=1=rimull -8(�p), �x   //eax*ebp小8处的位置的值   eax=r *ximull -12(�p), �x  //eax*ebp小12处的位置的值    eax=r *x *yimull -16(�p), �x  //eax*ebp小16处的位置的值   eax=r *x *y *zmovl �x, -20(�p)   //ebp小20处的位置的值变为eax   r=eaxaddl $3, -4(�p)    ebp小4处的位置的值加三   i=i 3.L2:movl 12(�p), �x     //eax被赋值为ebp大12的位置的值 eax=n,subl $2, �x   //eax-2  eax=n-2cmpl -4(�p), �x   //比较eax和ebp小4处的值谁大,小于跳到L3,大于等于跳到L4   即比较i和n-2的大小,i>n-2跳转到L3jg.L3   jmp.L4.L5:movl -4(�p), �x  //eax=0=isall $2, �x     //eax*4addl 8(�p), �x  //eax 大于ebp8的位置的值   即eax=0 a[]movl (�x), �x   //eax=a[i]movl -20(�p), �x  //edx=1=r imull �x, �x   //eax*=edx 即eax=a[i]*rmovl �x, -20(�p)  //ebp小20处的位置的值等于eax    r=eaxaddl $1, -4(�p)   //ebp小4处的位置的值 =1     i =1.L4:movl -4(�p), �x    //eax=0cmpl 12(�p), �x  //比较eax和比ebp大12处的位置的值,小于则跳转到L5jl.L5movl -20(�p), �x  //eax=ebp小20处的位置的值leave   //退出ret

第三题

有如下C语言程序及在Ubuntu 32位系统下用gcc编译而得到的汇编代码,请详细解释每一条汇编指令的意义并将c语言程序补充完整。

我的解答:

代码语言:javascript复制
三、#include <stdio.h>int frac(int a){if(a<2) return a*a;return frac(a-2) a;}int sum(int a,int b){int c=frac(a b);return 2*c b;}int main(){int i=10,j=6;int k=sum(j-i,i  );return 0;}

代码语言:javascript复制
汇编代码:frac:pushl �p          //压栈movl %esp, �p     //栈帧subl $24, %esp  //esp-24,开辟空间cmpl $1, 8(�p)    //比较1和a的大小,a>1则跳到L2jg .L2movl 8(�p), �x  //eax=aimull 8(�p), �x     //eax*=eax,eax=a*ajmp .L3    //无条件跳转到L3.L2:movl 8(�p), �x  //eax=asubl $2, �x   //eax-=2  eax=a-2movl  �x, (%esp)    //esp的位置=eax=a-2call  frac   //调用frac,此时由于esp的位置是a-2,因此相当于frac(a-2)addl 8(�p), �x //eax =a,即eax=frac(a-2) a.L3:leave   //退出 retsum:pushl  �p   //压栈movl   %esp, �p   //栈帧subl $40, %esp   //esp-40开辟空间movl 12(�p), �x  //eax=bmovl 8(�p), �x  //edx=aaddl �x, �x     //eax =edx,eax=b amovl �x, (%esp)   //eax给到espcall frac   //调用frac函数,同上面的那个frac,相当于frac(a b)movl �x, -12(�p)   //c=frac(a b)movl -12(�p), �x   //eax=caddl �x, �x    //eax =eax,eax=2*caddl 12(�p), �x    //eax =b,eax=2*c bleaveretmain:pushl �p   //压栈movl %esp, �p    //栈帧andl $-16, %esp    //esp和-16与运算subl $32, %esp      //esp-32开辟空间movl $10, 20(%esp)  //i=10movl $6, 24(%esp)    //j=6movl 20(%esp), �x  //eax=10=imovl 24(%esp), �x     //edx=6=jsubl �x, �x   //edx=-4movl 20(%esp), �x   //eax=10addl $1, 20(%esp)   //i=11movl �x, 4(%esp)  //esp大于4处=-4movl �x, (%esp)   //eax给到esp=10call sum  //调用sum,sum函数需要两个参数,这两个参数在上面,也就是sum(j-i,i  )movl �x, 28(%esp)    //esp大于28处=10,即k=eax=sum(j-i,i  )movl $0, �x   //eax=0leave   //退出ret

第三次课程作业:

不是很想做硬件。。。

第四次

课本有答案

0 人点赞