CSAPP:汇编代码

反汇编这一块有点绕啊…
第四次作业,第一次写后参考大佬的答案做了很多改动
记录一下提醒自己,再检查一次就上交啦~?
 

反汇编练习

3.61
long cread(long *xp) {
return (xp?*xp:0);}
因为计算机的条件传送指令,会导致对空指针的访问
改进

long cread_alt(long *xp)
{ long *temp,a=0;
 temp=xp?xp:&a;
return temp;}

问题
第一次写了int temp,运行了一下会报错的,因为指针是long型,只能同类型指针相互赋值
开始写了&0,会报错的,要设置变量=0,再赋变量的地址
返回的是*temp,不要漏


3.62

long switch3(long *p1, long *p2, mode_t action)
{
long result = 0;
Switch(action){
 case MODE_A:{result=*p2;action=*p1;*p2=*p1;break;}
case MODE_B:{result=*p1+*p2;*p1=result;break;}
case MODE_C:{*p1=59;result=*p2;break;}
case MODE_D:{result=*p2;*p1=result;result&=0xFFFFFFFF00000000;result|=0x1B;break;}
case MODE_E:{result=27;break;}
default:result=12;
}
return result;
}

这道题觉得网上的答案都有点小问题…可能是我还没理解透彻?
问题
一开始都没写*,要注意指针的取值啊……
把64bits赋给32bits的action可以直接赋值,应该会自动截取后32位的(参考赋long给int)
带$的数字不用转换成16进制了,可以直接用的
MODE D和网上写的不一样,因为觉得movl只改变后32位,result是64位的,但是default里没关系,因为初始化了0

3.63

long switch_prob(long x,long n) {
long result = x;
switch(n) {
case 60:
 case 62: {result*=8;break;}
case 63:{result=x>>3;break;}
 case 64:{result=x*15;x=result;}
 case 65:result=x*x;
default: result=x+0x4b;
}
return result;
}

问题
最开始的几条指令对n做了-60的操作,没看出来!!
可以从对n的ja判断里看出defalut是c3,没看出来!!
之后做的还可以,网上都没写出64里实际是*15

交作业去啦~继续冲呀!!?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值