反汇编这一块有点绕啊…
第四次作业,第一次写后参考大佬的答案做了很多改动
记录一下提醒自己,再检查一次就上交啦~?
反汇编练习
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
交作业去啦~继续冲呀!!?