首页 > 学院 > 开发设计 > 正文

CSAPP(深入理解计算机系统)第二版家庭作业答案-第三章

2019-11-06 08:24:56
字体:
来源:转载
供稿:网友
答案均由本人完成,并且实验或者调试,欢迎参考!
3.54int decode2(int x,int y,int z){	int t=z-y;	int t2=t<<15;	t2=t2>>15;	return (x^t)*t2;}3.55movl 12(%ebp),%esi  ;Get x的低位movl 20(%ebp),%eax  ;Get ymovl %eax,%edxsarl $31,%edx ;取y的符号位movl %edx,%ecximull %esi,%ecx ;%ecx=x的低位*y的符号位(0或者-1)movl 16(%ebp),%ebx;Get x的高位imull %eax,%ebx ;%ebx=x的高位*yaddl %ebx,%ecx  ;%ecx=x的高位*y+x的低位*y的符号位(0或者-1)mull %esi       ;%edx=(x的低位*y)的高位 %eax=(x的低位*y)的低位leal (%ecx,%edx),%edxmovl 8(%ebp),%ecxmovl %eax,(%ecx)movl %edx,4(%ecx)(x的低位*y)的高位+x的高位*y+x的低位*y的符号位(0或者-1) 存储在高位(x的低位*y)的低位 存储在低位(xl*y)_h+xh*y+xl*-1(x1*y)_lxl=1000xh=0000y=1001x*yi=x*(yu-16)=x*yu-16x相当于高位=(x*yu)_h-x,低位=(x*yu)_l因为这里是mull无符号乘法3.56A.x:%esi,n:%ebx,result:%edi,mask:%edxB.result=0x55555555; //‭0101 0101 0101 0101 0101 0101 0101 0101‬mask=0x80000000;C.mask!=0D.mask每次循环右移n位E.result每次循环和x&mask的值进行异或F.int loop(int x,int n){	int result=0x55555555;	int mask;	for(mask=0x80000000;mask!=0;((unsigned)mask)>>n)//汇编中mask是逻辑右移,而mask是有符号整型应该先转成无符号整型才能保证C语言的右移操作符编译成汇编的逻辑右移	{		result^=x&mask;	}	return result;}3.57int cread_alt(int *xp){	int t=0;	int *p=xp?xp:&t;	return *p;}3.58int switch3(int *p1,int *p2,mode_t action){	int result=0;	switch(action)	{		case MODE_A:			result=*p1;			*p1=*p2;			break;		case MODE_B:			result=*p1+*p2;			*p2=result;			break;		case MODE_C:			*p2=15;			result=*p1;			break;		case MODE_D:			*p2=*p1;		case MODE_E:			result=17;			break;		default:			result=-1;			break;	}	return result;}3.59int switch_PRob(int x,int n){	int result=x;	switch(n)	{		case 40:		case 42:			result<<=3;			break;		case 43:			result>>=3;			break;		case 44:			result<<=3;			result-=x;		case 45:			result*=result;		case 41:  //可以不要		default:			result+=11;			break;	}	return result;}3.60A.A[i][j][k]=A+((2^6-1)*i+9j+k)*4=A+(63i+9j+k)*4B.T=9S*T=63R*S*T=2772/4=693R=11 S=7 T=93.61int var_prod_ele(int n, int A[n][n], int B[n][n], int i, int k){    int result = 0;    int *a = &A[i][0];    int *b = &B[0][k];    int *e = &A[i][n];    for(;a!=e;)    {        result += *a * *b;        b+=n;        a++;    }    return result;}下面是其汇编代码的循环部分:edi是4*n,ebx和edx分别是b和a,esi是e,eax是result。ecx是用于存储乘法的寄存器。L4:movl (%ebx), %ecximull (%edx), %ecxaddl %ecx, %eaxaddl %edi, %ebxaddl $4, %edxcmpl %edx, %esijne L4result,Arow,Bcol,4*n这四个值耗费的存储器必不可少n的值转变为e的值耗费一个寄存器比较n和a的值,省掉了变量j,少用了一个寄存器3.62A.M=76/4=19B.i:%edi,j:ecxC.void transpose(int A[M][M]){	for(int i=0;i<M;i++)	{		int *Arr=&A[i][0];		int *Brr=&A[0][i];		for(int j=0;j<i;j++)		{			int t=*Arr;			*Arr=*Brr;			*Brr=t;			Arr+=1;			Brr+=M;		}	}}3.63#define E1(n) 3*n#define E2(n) 2*n-13.64A.8(%ebp) &s212(%ebp) s1.p16(%ebp) s1.vB.------------%ebps2.sums2.prods1.vs1.p&s2------------%espC.将结构的各个成员的值传递进方法D.调用者将返回值变量的地址传递进方法3.65A=3 B=73.66A.CNT=196/28=7B.typedef struct{	int idx;	int x[6];}a_struct;ap->idx=*(bp+1c*i+4)*4ap->x[ap->idx]=(bp+4+28*i+4)+*(bp+0x1c*i+4)*4=bp+8+28i+*(bp+28i+4)*4=bp+8+4(7i+*(bp+28i+4))3.67A.e1.p:0e1.x:4e2.y:0e2.next:4B.8C.void proc(union ele *up){	up->e2.next->e1.x=*(up->e2.next->e1.p) - up->e2.y;}3.68void good_echo(){    char c;    int x = 0;    while( x=getchar(), x!='/n' && x!=EOF)    {        putchar(x);    }}3.69A.long trace(tree_ptr tp){	long result=0;	while(tp)	{		result=tp->val;		tp=tp->left;	}	return result;}B.输出二叉树最左边节点的值3.70A.long traverse(tree_ptr tp){	if(!tp)		return 9223372036854775807;//long.max	long v=tp->val;	long left=traverse(tp->left);	long result=traverse(tp->right);	if(left<result)		result=left;	if(result>v)		result=v;	return result;}B.求二叉树节点中最小的值原创地址:http://blog.csdn.net/maidou0921/article/details/53907971
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表