double类型逆向

发到了看雪:http://bbs.pediy.com/showthread.php?t=153009

建议先自己动手尝试一下再阅读本文。

看代码:
代码:
9:        double fDouble = 15.5;  
00410958   mov         dword ptr [ebp-8],0  
0041095F   mov         dword ptr [ebp-4],402F0000h 
402F0000用计算器转为二进制为1000000001011110000000000000000,注意计算器可能忽略了前面的0,所以你需要检查结果是不是32位,这里少了首位0,加上之后为:
01000000001011110000000000000000
根据mov         dword ptr [ebp-8],0,得到补上末尾的32位为:
0100000000101111000000000000000000000000000000000000000000000000
开始分析:
第一位符号位:0
之后的十一位为指数位:10000000010,减去1023后得3
剩余为尾数位:1111000000000000000000000000000000000000000000000000
把尾数位补上1,小数点点在后面:
1.1111000000000000000000000000000000000000000000000000
小数点根据指数位,向后移动:
1111.1000000000000000000000000000000000000000000000000
还原成了二进制小数,这里有一篇不错的文章详述了十进制数与二进制数的互转,如果你不熟悉,可以参考: http://hi.baidu.com/ctzhidao/item/cf...48c51e886d10f8
这里给出转为十进制后的结果:
整数位:
1+2+4+8=15
小数位:
(2^-1)*1=0.5
结果:15+0.5=15.5
完毕
需要注意的是,由于入栈时栈顶是从高地址向低地址增长的,所以这种情况要把第一个push后面的操作数放到前面:
代码:
9:        printf("%.1f\n", 8.0/5.0);  
00410958   push        3FF99999h  
0041095D   push        9999999Ah  
练习:把以下汇编代码逆向为C代码:
代码:
00401028   push        40080000h
0040102D   push        0
0040102F   call        _sqrt (00401124)
00401034   add         esp,8
00401037   fadd        st(0),st
00401039   fdiv        qword ptr [__real@8@40019cccccccccccd000 (00428038)]
0040103F   fadd        qword ptr [__real@8@3fff8000000000000000 (00428028)]
00401045   sub         esp,8
00401048   fstp        qword ptr [esp]
0040104B   push        offset string "%.8f\n" (0042801c)
00401050   call        printf (00401090)
00401055   add         esp,0Ch
附:
00428038  9A 99 99 99 99 99 13 40
00428028  00 00 00 00 00 00 F0 3F

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值