前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算机系统课程作业

计算机系统课程作业

作者头像
Heeler-Deer
发布2023-07-24 19:52:29
1260
发布2023-07-24 19:52:29
举报
文章被收录于专栏:HD-学习笔记

小班讨论

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

其中第几次小班讨论以英文字母区分,如第一次就是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 %ebp 前两行压程序栈movl %esp,%ebppush %ebx 压 f 函数栈movl 8(%ebp), %ecx 赋值 xmovl 12(%ebp), %edx 赋值 ymovl 12(%ebp), %eax 赋值 yaddl %eax, %eax eax 自增为 2 倍(2y)addl 8(%ebp), %eax eax=eax+ecx x+2*ysall $4, %ecx ecx 的值左移 4 位 x*16leal (%ecx,%edx), %edx 把 ecx+edx 的地址给 edx x*16+y 即 x 的系数 J=16movl %eax, array1(,%edx,4) 把 eax 的值给 array1 的 edx* 4 位的地方 4*(x* 16+y)的地方=x+2* y,即 array1[x][y]=x+2*ymovl 12(%ebp), %edx 赋值 ymovl 8(%ebp), %ebx 赋值 xmovl 8(%ebp), %eax 赋值 ximull 8(%ebp), %eax eax=eax* eax x*xmovl 12(%ebp), %ecx ecx=edx ecx 处=ysubl %eax, %ecx ecx=ecx-eax y-x*xmovl %edx, %eax eax=edx eax 处=ysall $3, %eax eax < < 3 相当于y < < 3 3 即是 J 的值addl %edx, %eax eax=eax+edx y< <3+ysall $2, %eax eax< <2 (y< <3+y)< <2addl %edx, %eax eax=edx+eax (y< <3+y)< <2+yaddl %ebx, %eax eax=eax+ebx (y< <3+y)< <2+y+x 即 y 的系数 H=(8+1)*4+1=37movl %ecx, array2(,%eax,4) 把 array2 的 4* eax 的地方赋值为 ecx 即 array2 的 4*eax 的地方=y-x *x 即 array2[x][y]=y-x*xpopl %ebx 出函数栈popl %ebp 出栈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 %ebp //前两行压栈movl %esp, %ebp //栈帧subl $32, %esp //esp-32movl $1, -20(%ebp) //ebp小20的位置放1 r=1movl $0, -4(%ebp) //ebp小4的位置放0 i=0jmp.L2 //无条件跳转到.L2.L3:movl -4(%ebp), %eax //eax=0=isall $2, %eax //eax=0*4=0addl 8(%ebp), %eax //eax加上ebp大8的位置,即eax+=a[]movl (%eax), %eax //eax=a[i]movl %eax, -8(%ebp) //ebp小8的地方赋值为eax x=a[i] movl -4(%ebp), %eax //eax=i=0addl $1, %eax //eax=i+1=1,sall $2, %eax //eax=4addl 8(%ebp), %eax //eax加上ebp大8的位置 eax=4+a[]movl (%eax), %eax //eax=a[i+1]movl %eax, -12(%ebp) //ebp小12的位置变为eax y=a[i+1]movl -4(%ebp), %eax //eax=ebp小4的位置 eax=i=0addl $2, %eax //eax+=2 eax=2sall $2, %eax //eax*=4 eax=8addl 8(%ebp), %eax //eax+ebp大8的位置 eax=8+a[]movl (%eax), %eax //eax=a[i+2]movl %eax, -16(%ebp) //ebp小16的位置放eax z=eax=a[i+2]movl -20(%ebp), %eax //eax=1=rimull -8(%ebp), %eax //eax*ebp小8处的位置的值 eax=r *ximull -12(%ebp), %eax //eax*ebp小12处的位置的值 eax=r *x *yimull -16(%ebp), %eax //eax*ebp小16处的位置的值 eax=r *x *y *zmovl %eax, -20(%ebp) //ebp小20处的位置的值变为eax r=eaxaddl $3, -4(%ebp) ebp小4处的位置的值加三 i=i+3.L2:movl 12(%ebp), %eax //eax被赋值为ebp大12的位置的值 eax=n,subl $2, %eax //eax-2 eax=n-2cmpl -4(%ebp), %eax //比较eax和ebp小4处的值谁大,小于跳到L3,大于等于跳到L4 即比较i和n-2的大小,i>n-2跳转到L3jg.L3 jmp.L4.L5:movl -4(%ebp), %eax //eax=0=isall $2, %eax //eax*4addl 8(%ebp), %eax //eax+大于ebp8的位置的值 即eax=0+a[]movl (%eax), %eax //eax=a[i]movl -20(%ebp), %edx //edx=1=r imull %edx, %eax //eax*=edx 即eax=a[i]*rmovl %eax, -20(%ebp) //ebp小20处的位置的值等于eax r=eaxaddl $1, -4(%ebp) //ebp小4处的位置的值+=1 i+=1.L4:movl -4(%ebp), %eax //eax=0cmpl 12(%ebp), %eax //比较eax和比ebp大12处的位置的值,小于则跳转到L5jl.L5movl -20(%ebp), %eax //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 %ebp //压栈movl %esp, %ebp //栈帧subl $24, %esp //esp-24,开辟空间cmpl $1, 8(%ebp) //比较1和a的大小,a>1则跳到L2jg .L2movl 8(%ebp), %eax //eax=aimull 8(%ebp), %eax //eax*=eax,eax=a*ajmp .L3 //无条件跳转到L3.L2:movl 8(%ebp), %eax //eax=asubl $2, %eax //eax-=2 eax=a-2movl %eax, (%esp) //esp的位置=eax=a-2call frac //调用frac,此时由于esp的位置是a-2,因此相当于frac(a-2)addl 8(%ebp), %eax //eax+=a,即eax=frac(a-2)+a.L3:leave //退出 retsum:pushl %ebp //压栈movl %esp, %ebp //栈帧subl $40, %esp //esp-40开辟空间movl 12(%ebp), %eax //eax=bmovl 8(%ebp), %edx //edx=aaddl %edx, %eax //eax+=edx,eax=b+amovl %eax, (%esp) //eax给到espcall frac //调用frac函数,同上面的那个frac,相当于frac(a+b)movl %eax, -12(%ebp) //c=frac(a+b)movl -12(%ebp), %eax //eax=caddl %eax, %eax //eax+=eax,eax=2*caddl 12(%ebp), %eax //eax+=b,eax=2*c+bleaveretmain:pushl %ebp //压栈movl %esp, %ebp //栈帧andl $-16, %esp //esp和-16与运算subl $32, %esp //esp-32开辟空间movl $10, 20(%esp) //i=10movl $6, 24(%esp) //j=6movl 20(%esp), %eax //eax=10=imovl 24(%esp), %edx //edx=6=jsubl %eax, %edx //edx=-4movl 20(%esp), %eax //eax=10addl $1, 20(%esp) //i=11movl %edx, 4(%esp) //esp大于4处=-4movl %eax, (%esp) //eax给到esp=10call sum //调用sum,sum函数需要两个参数,这两个参数在上面,也就是sum(j-i,i++)movl %eax, 28(%esp) //esp大于28处=10,即k=eax=sum(j-i,i++)movl $0, %eax //eax=0leave //退出ret

第三次课程作业:

不是很想做硬件。。。

第四次

课本有答案

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月4日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 小班讨论
  • 课程作业
    • 第二次课程作业:
      • 第三次课程作业:
        • 第四次
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档