计算机系统课程作业

2023-07-24 19:52:29 浏览数 (1)

小班讨论

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

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

没有传的就是我没做的

GitHub

课程作业

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

第二次课程作业:

简单的放点题目:

第一题

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

123456789101112131415161718192021222324252627

# 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;}

我的解答:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

一、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位系统下编译得到的汇编语言程序代码,请详细说明每条汇编语句的意义,并将这个函数补充完整。

我的解答:

123456789101112131415161718192021222324252627

二、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;}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107

汇编分析: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语言程序补充完整。

我的解答:

1234567891011121314151617181920212223242526272829303132333435

三、#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;}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101

汇编代码: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 人点赞