首页
社区
课程
招聘
[讨论]OD里面FPU寄存器计算的BUG?
2014-10-16 14:16 5780

[讨论]OD里面FPU寄存器计算的BUG?

2014-10-16 14:16
5780
近期在写调试器, 因为我的调试起是防 OD的视图结构写的,所以很多地方参考了OD的界面
在FPU转换的时候发现个问题:

0x3F800000  是float 1.0

0 x3FF0 0000 0000 0000 是double 1.0

以上计算,使用的是VC printf 方法的原理转换得到, 关于转换的话题很多,可以自行参考

在处理 80位的时候 (1 + 15 + 64)
0x 3FFF 8000 0000 0000 0000
由于VC没有80为的处理,所以我将它转换为 64位:
0 x 3FF8 0000 0000 0000
故得到 
1.50000000000

不过,我在 OD 上发现, 80位相同的数据 0x 3FFF 8000 0000 0000 0000
它显示的 1.0000000000

难道是它错了?  还是我错了? 错在哪呢?

在OD中,可以直接在winxp sp3 下装载 Notepad.exe
默认看到FPU 寄存器的内容 1.00000000000 双击可以看到hex

附一张偶写的调试器, 看看像不像OD

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (14)
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-16 16:33
2
0
没有人注意到这一点吗
雪    币: 1042
活跃值: (455)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Rookietp 2014-10-16 18:10
3
0
界面碉堡
雪    币: 1361
活跃值: (928)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
sssccc 2014-10-16 19:57
4
0

看看我写的像不像OD mfc写的 无第三方库
上传的附件:
雪    币: 768
活跃值: (420)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
FishSeeWater 11 2014-10-16 22:11
5
0
现下流行写debuger了?
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-17 09:47
6
0
[QUOTE=sssccc;1324259]
看看我写的像不像OD mfc写的 无第三方库 [/QUOTE]

早知道这样,我就跟你索代码了
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dppdpp 2014-10-18 11:52
7
0
FPU你全按16进制试试,OD自带的反汇引挚问题很多,不知楼主用的是哪里的反汇编引挚
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
kaoyange 1 2014-10-18 13:45
8
0
"在处理 80位的时候 (1 + 15 + 64)
0x 3FFF 8000 0000 0000 0000
由于VC没有80为的处理,所以我将它转换为 64位:
0 x 3FF8 0000 0000 0000
故得到 
1.50000000000"

楼主,你的这段转换是有问题的,所以得出错误的结论。

不知你有没有看过将float转换为double的反汇编代码?如果你看过就知道VC应该有80位的处理,在VC里记得应该是ST0~ST7这8个寄存器,都是80位的,即扩展精度浮点寄存器。

希望对你有帮助!
雪    币: 9
活跃值: (279)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
杨开银 2014-10-18 15:16
9
0
大师 你的调试器发布吗、》
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-18 22:43
10
0
回复 dppdpp 我用的是beaengine
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-18 22:47
11
0
回复kaoyange 能详细一点吗
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-18 22:48
12
0
现在发布一点意义没,等64位做好再发
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-19 08:16
13
0
我说的VC不支持是指 VC没有扩展双精度浮点的数据类型,
另,我按你说的看了一下 float 转 double 的汇编代码, 它的汇编是用专用的浮点指令实现的,这个当然是80位, 如果手工算 80位 浮点 转换为 64位浮点应该怎么转换呢? 是不是我下面的算法:

80位是 1 + 15 + 64
64位是 1 + 11 + 52

将 80位的尾数部分去掉尾巴 变成 64位的尾数
指数变换成相应的指数部分
符号位对应符号位

这样转换是有问题的吗?
雪    币: 168
活跃值: (823)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
kaoyange 1 2014-10-19 12:59
14
0
80位:1 + 15 + 64  这个64位不是单单指尾数部分,它还包括小数点前的整数1,这个和IEEE 754的标准形式即省略1不同,这是本问题的关键

64位:1 + 11 + 52 由于这个是IEEE 754浮点标准,所以这个52位全是小数部分,它省略了小数点前的整数1。

也就是说在这个问题中,你从80位转到64位,应该是要用80位的后64位(即1.0)减去1得到64位的小数部分0,而不是单单去掉64位的后12位变为52位。
雪    币: 160
活跃值: (262)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 1 2014-10-19 14:03
15
0
哦,那我就懂了,谢谢了
游客
登录 | 注册 方可回帖
返回