首页
社区
课程
招聘
浮点运算求救,急!!!!
发表于: 2005-3-7 21:05 5967

浮点运算求救,急!!!!

2005-3-7 21:05
5967
我在跟踪一个软件算法的时候碰到下面的浮点运算。
004AC670   > 8B5424 24      MOV EDX,DWORD PTR SS:[ESP+24]
004AC674   . DD84D4 8812000>FLD QWORD PTR SS:[ESP+EDX*8+1288]
//第一次到这里的时候 edx=0, SS:[ESP+EDX*8+1288] 的数据如下面给出的。st0=4.7999999999999998220
  第二次到这里的时候 edx=1, SS:[ESP+EDX*8+1288] 的数据如下面给出的。st0=18.800000000000000710
  第三次到这里的时候 edx=2, SS:[ESP+EDX*8+1288] 的数据如下面给出的。st0=53.399999999999998580
  第四次到这里的时候 edx=3, SS:[ESP+EDX*8+1288] 的数据如下面给出的。st0=33.100000000000001420

帮忙看看怎么进行浮点运算才能得到这些st0。我怎么也算不出来。谢谢指点。

SS:[ESP+EDX*8+1288] <->SS:[0012E048]

0012E048   33333333
0012E04C   40133333
0012E050   CCCCCCCD
0012E054   4032CCCC
0012E058   33333333
0012E05C   404AB333
0012E060   CCCCCCCD
0012E064   40408CCC
0012E068   66666666
0012E06C   40026666
0012E070   33333333

接上面的004AC674,
004AC67B   . DC0D 90085F00  FMUL QWORD PTR DS:[5F0890]
004AC681   . DC05 18715E00  FADD QWORD PTR DS:[5E7118]
004AC687   . E8 78B60900    CALL Diamond.00547D04
004AC68C   . 8BF0           MOV ESI,EAX
004AC68E   . DD44F4 48      FLD QWORD PTR SS:[ESP+ESI*8+48]
004AC692   . DC0D 90085F00  FMUL QWORD PTR DS:[5F0890]
004AC698   . DC05 18715E00  FADD QWORD PTR DS:[5E7118]
004AC69E   . E8 61B60900    CALL Diamond.00547D04
004AC6A3   . 8B9CB4 C824000>MOV EBX,DWORD PTR SS:[ESP+ESI*4+24C8]
004AC6AA   . 894424 20      MOV DWORD PTR SS:[ESP+20],EAX
004AC6AE   . 8B4424 14      MOV EAX,DWORD PTR SS:[ESP+14]

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 4908
活跃值: (2343)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
下面的内容是我以前的提问,别人的回答,如下:

[CODE]
>>我想进行浮点数的运算,用来解决三角函数、乘、除等运算。

ok,

>>看了有关的E文资料,却对其中的FPU寄存器的存取和操作不太明白,谁能给点详细的资料吗?

MASM32 V8的HELP目录下有一个FPHELP.HLP文件,看看再练习练习就明白了。

>>好象浮点数运算必须用到FPU寄存器吗?

是。

>>资料里说STO~ST6,这些寄存器怎么使用?

准确说应该说是ST(0)~ST(7),使用方法跟常规寄存器类似。

>>比如我们用EAX,可以直接LODSB,或者LEA EAX,AEERESS,这些FPU寄存器怎么使用?

对应“LODSB”的指令有:

fld    Push real onto stack
fild    Convert two's complement integer to real and push

对应“LEA EAX,AEERESS”没有!你要这个干什么?

这是我Crackme3中的一段源程序,仅供参考。

  Code: [Copy to clipboard]   
    mov dwAngle,edx        ;将上面的计算值存入变量   
   
    fld rMagic        ;将一个常数装到st(0)

    fdiv r100        ;将这个数除以100,结果在st(0)

    fiadd dwAngle               ;加上面提到的值,结果在st(0)

    fmul rPI        ;×π,结果在st(0)。当然调π值有一个专门的指令fldpi

    fdiv rDEG        ;除以一个常数,结果在st(0)

    fcos                   ;cos上面的结果,结果在st(0)

    fabs                   ;取绝对值,结果在st(0)
  
    fmul rty        ;×一个常数,结果在st(0)

    fmul r100        ;×一个常数,结果在st(0)

    frndint        ;取整,结果在st(0)
  
    fcom r123        ;st(0)中的值跟一个常数比较,影响C0 - C3标志位(word)

    fstsw ax        ;因上面的标志位在程序中无法直接使用,故将这个Word值存入ax寄存器

    sahf        ;Store AH Register into FLAGS
   
    jnz _Quit        ;这时我们就可以判断了 :)

    xor eax,eax        ;跟FPU无关

    inc al                   ;跟FPU无关

    jmp _Exit        ;跟FPU无关

希望上面的解释对你有点帮助,看不清楚的地方再讨论。
2005-3-7 21:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
非常感谢你提供的资料。我的问题主要是在。程序怎么从堆栈里读出一个16进制字符串,然后转换成浮点数。 我怎么拼凑都不行,这个指令的功能我知道一些
2005-3-7 22:40
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
4
那个本来就是浮点数的机器码形式.
IEEE浮点计算工具:
http://www.pediy.com/tools/code/FloatConvert/FloatConvert.rar
2005-3-7 23:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我用过这个工具。可是堆栈了的数据。取出十六进制数(堆栈的64位数)
转换就是得不到程序的结果。 fld这个指令取出16进制字符串转换成浮点数。
麻烦楼上的帮我试一两个结果怎么样,谢谢!!
2005-3-8 08:32
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
6
不明白你的意思......
2005-3-8 11:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我的意思就是,我按指令在堆栈里取出的字符串转换成浮点数,转换的值和被调试程序给出的值不同。
2005-3-8 12:18
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
8
od里面显示都很清楚了啊,用不着自己计算,要写代码,你也来一个fld不就成了吗
2005-3-8 12:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
太谢谢了。能否把你的转换程序源代码(非汇编语言的)给我一份。
e-mail: connoy@sina.com
2005-3-8 14:38
0
雪    币: 212
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你把一个double指针指向堆栈,之后printf("%f\n", pDouble);

就可以显示出来啦。
2005-3-8 21:21
0
雪    币: 9
活跃值: (374)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
ikki od里面显示都很清楚了啊,用不着自己计算,要写代码,你也来一个fld不就成了吗
深奥的浮点,我也遇到一个,困惑了
2018-5-5 13:25
0
游客
登录 | 注册 方可回帖
返回
//