首页
社区
课程
招聘
[求解]fld的使用!!!
发表于: 2007-3-18 11:51 3988

[求解]fld的使用!!!

2007-3-18 11:51
3988
我是新手,这是我第一个帖子。首先要感谢看雪和看雪论坛的兄弟姐妹把我带入crack的世界。

近期跟一个软件,跟到一个浮点入盏关键句 fld qword [esp+24]。
当[esp+24]内存指向的值为 00 00 00 00 00 00 00 40 时(16进制)。st0=2
当[esp+24]内存指向的值为 00 00 00 00 00 00 10 40 时(16进制)。st0=4
当[esp+24]内存指向的值为 00 00 00 00 00 00 20 40 时(16进制)。st0=8
......
当[esp+24]内存指向的值为 00 00 00 00 00 00 00 20 时(16进制)。st0=1.49E-154

求解,计算机是怎样通过入盏的[esp+24]内存值得出入盏的st(0)??????
谢谢各位大哥。

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
自己找浮点指令的相关介绍看
要不浮点指令这么多,你打算全都发帖问?
2007-3-18 13:46
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我在论坛以及网上都查过关于fld scr的使用.都是很简单的说浮点入盏.有人说是16进制变成10进制入st0.那么小数点部分呢??????而且在我这个例子里不合数.
希望有经验的大哥能指点下,谢谢~~!
2007-3-18 16:29
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
4
择自:Intel? 64 and IA-32 Architectures
Software Developer’s Manual
Volume 2A:
Instruction Set Reference, A-M

Description
Pushes the source operand onto the FPU register stack. The source operand can be in
single-precision, double-precision, or double extended-precision floating-point
format. If the source operand is in single-precision or double-precision floating-point
format, it is automatically converted to the double extended-precision floating-point
format before being pushed on the stack.
The FLD instruction can also push the value in a selected FPU register [ST(i)] onto the
stack. Here, pushing register ST(0) duplicates the stack top.
This instruction’s operation is the same in non-64-bit modes and 64-bit mode.
Operation
IF SRC is ST(i)
THEN
temp ← ST(i);
FI;
TOP ← TOP ? 1;
IF SRC is memory-operand
THEN
ST(0) ← ConvertToDoubleExtendedPrecisionFP(SRC);
ELSE (* SRC is ST(i) *)
ST(0) ← temp;
FI;

这个就是FLD的解释了,至于如何将一个整数转换成浮点数,请参考下面内容
http://www.yuanma.org/data/2006/0603/article_588.htm

最后,活用搜索引擎,就可以找到你要的答案了
2007-3-18 18:00
0
雪    币: 413
活跃值: (752)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
浮点运算简介

                                        Hume/冷雨飘心

对于习惯于C的灵活多变的数据类型和方便的计算那些人而言,了解底层的浮点运算似乎没有什么意义,现在Visual盛行的时代还有多少人关心那些所谓的底层呢?
对了AfOs来说,浮点运算是编程中很重要的一部分,因为我们可能会面临一些稍微复杂的运算,如果你和我一样是Die-hard的asm拥护者,不想轻易用C来解决问题,你肯定能想像在asm下用整数运算求sin(2.3)的痛苦,实际上,微机早就为我们准备了解决之道:那就是浮点运算.但现在关于浮点运算的资料较少,相信很多人和我一样还不掌握这种强有力的技术,那好,我们一起来学习学习.
                     

                                (一)浮点数
                                    (This Part mainly Froe Bill's Article)
在这之前,先来看几个术语:
FPU->Floating Point Unit,浮点运算部件
BCD->Binary Coded Decimal 压缩的二十进制数,是用4个位来表示数字0~9,一个byte表示两个十进制数,比如01111001表示89
科学计数法:这是科学的~~~~具体含义查查初中还是小学的数学课本 D:)

浮点运算使用三种不同的数据:
        1)整数(Integer),又分为字,短整数(Short Integer)和长整数(Long Integer)
        2)实数(Real)分单精度(Single Real)和双精度(Double Real)
        3)压缩的二十进制数(BCD)
   
    下面是其位数(bits)和能表示的大致范围和

        Type            Length          Range
        -----------------------------------------------
        Word Integer    16 bit          -32768 to 32768
        Short Integer  32 bit          -2.14e9 to 2.14e9
        Long Integer    64 bit          -9.22e18 to 9.22e18
        Single Real    32 bit          1.18e-38 to 3.40e38
        Double Real    64 bit          2.23e-308 to 1.79e308
        extended Real  80 bit          3.37e-1932 to 1.18e4932
        Packed BCD      80 bit          -1e18 to 1e18

双精度数和扩展精度数表示范围对一般应用来说已经足够大了!

1)整数,以补码形式存储,正数的补码是其本身,负数补码是其绝对值的各位变反后加1,下面是实际存储的例子:
        0024            var1 dw 24
        FFFE            var2 dw -2
        000004D2        var3 dd 1234
        FFFFFF85        var4 dd -123
        0000000000002694var5 dq 9876
        FFFFFFFFFFFFFEBFvar6 dq -321

2)BCD数
        在FPU中用80位表示正好是浮点堆寄存器的宽度,在其格式如下存储:
    Bit
        79___72_71________________________________________0
        符号            ---18个二十进制数--------
看下面的例子:
        00000000000000012345        var1  dt    12345
        80000000000000000100        var2  dt    -100

3)浮点数,这个复杂点,有三种格式

        单精度:_31_30________23_22___________0
              符号    指数        有效数

        双精度:_63_62__________52_51__________________0
              符号    指数            有效数

        扩展精度数:
              _79_78____________64_63___________________0
              符号    指数              有效数
例子:
        C377999A                    var1  dd      -247.6
        40000000                    var2  dd      2.0
        486F4200                    var3  real4  2.45e+5
        4059100000000000            var4  dq      100.25
        3F543BF727136A40            var5  real8  0.00123

        C377999A                    var1  dd      -247.6
        40000000                    var2  dd      2.0
        486F4200                    var3  real4  2.45e+5
        4059100000000000            var4  dq      100.25
        3F543BF727136A40            var5  real8  0.001235
        400487F34D6A161E4F76        var6  real10
2007-3-18 20:50
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢版主和各位大哥的指引,问题解决了~

原来这个fld入盏是双精浮点型。有IEEE的计算规范。计算过程一般复杂。网上找到个文档在这方面很详细(http://bbs.pediy.com/showthread.php?s=&threadid=41308)。我先下载了。
2007-3-19 22:53
0
游客
登录 | 注册 方可回帖
返回
//