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。