小班讨论
这是本人自己做的小班讨论的题目,放在了 ,里面还包含有部分操作系统导论的代码。
其中第几次小班讨论以英文字母区分,如第一次就是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
第三次课程作业:
不是很想做硬件。。。
第四次
课本有答案