CSAPP第 3 章家庭作业(原书第二版)

本文涉及C代码与汇编的等价转换,包括变量操作、循环逻辑以及函数实现。具体涵盖int decode2()函数的解析,一个基于循环和位操作的loop()函数,以及根据模式进行数据交换和计算的switch3()函数。同时,还讨论了矩阵转置的C代码实现。
摘要由CSDN通过智能技术生成

3.54

等价于汇编代码的 decode2 的 C 代码:

int decode2(int x,int y,int z) 
{
	int temp1=z;
	temp1-=y;
	int temp2=temp1;
	temp2=temp2<<15;
	temp2=temp2>>15;
	temp1=temp1^x;
	return temp1*temp2;
}

3.56

A: %esi保存x,%ebx保存n,%edi保存result,%edx保存mask
B:result初始值为1431655765,mask初始值为-2147483648
C:测试条件:mask!=0
D:每次循环时mask右移n位改变其值
E:每次循环,result和(mask&x)异或改变其值
F:代码:

int loop(int x,int n)
{
	int result=1431655765;
	int mask;
	for(mask=-2147483648;mask!=0;((unsigned)mask)>>n)
	{
		result^=x&mask;
	}
	return result;
}

3.58

int switch3(int *p1,int *p2,mode_t action)
{
	int result=0;
	switch(action)
	{
		case MODE_A:
			result=*p1;
			*p1=*p2;
			break;
		case MODE_B:
			*p2=*p1+*p2;			
			result=*p1+*p2;
			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.62

A:M=19
B:%edi保存i,%ecx保存j
C:

void transpose(int A[M][M]){
    int i,j;
    for(i=0;i<M;i++){
        int *temp1 = &A[i][0];
        int *temp2 = &A[0][i];
        for(j=0;j<i;j++){
            int t = *temp1;
            *temp1 = *temp2;
            temp1++;          
            *temp2 = t;
            temp2 += M;
        }
    }
}

3.65

由汇编代码可得q->u的地址为28(%eax),q->t的地址为8(%eax)
所以28-8-4=2B+2或者28-8-4=2B,解得B=7或B=8,又因为2AB=44或者2A*B+2=44,结合B的两种可能得A=3,B=7。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值