当前位置: 代码迷 >> 综合 >> CSAPP:汇编代码
  详细解决方案

CSAPP:汇编代码

热度:39   发布时间:2023-12-06 12:18:20.0

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

反汇编练习

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

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