查看: 3475|回复: 5
收起左侧

[已解决] 关于汇编指令的求助……

 关闭 [复制链接]
prawnliu
发表于 2009-10-17 19:32:12 | 显示全部楼层 |阅读模式
浮点运算的汇编指令,哪位高手能给讲讲……
可一参照一下代码大概说一下(有点长……如果懒得看就大概说一下浮点运算的汇编指令吧……我自己都看蒙了……):

0040134A                   /$  55            PUSH EBP
0040134B                   |.  89E5          MOV EBP,ESP
0040134D                   |.  83EC 68       SUB ESP,68   
00401350                   |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
00401353                   |.  E8 78010000   CALL <JMP.&CRTDLL.atof>
00401358                   |.  DD55 E8       FST QWORD PTR SS:[EBP-18]
0040135B                   |.  83EC 08       SUB ESP,8
0040135E                   |.  DD1C24        FSTP QWORD PTR SS:[ESP]
00401361                   |.  E8 82010000   CALL <JMP.&CRTDLL.floor>
00401366                   |.  DD5D F8       FSTP QWORD PTR SS:[EBP-8]
00401369                   |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]
0040136C                   |.  E8 5F010000   CALL <JMP.&CRTDLL.atof>
00401371                   |.  DD55 D8       FST QWORD PTR SS:[EBP-28]
00401374                   |.  83EC 08       SUB ESP,8
00401377                   |.  DD1C24        FSTP QWORD PTR SS:[ESP]
0040137A                   |.  E8 69010000   CALL <JMP.&CRTDLL.floor>
0040137F                   |.  83C4 18       ADD ESP,18
00401382                   |.  DD55 F0       FST QWORD PTR SS:[EBP-10]
00401385                   |.  DC4D F8       FMUL QWORD PTR SS:[EBP-8]
00401388                   |.  D9EE          FLDZ
0040138A                   |.  DED9          FCOMPP
0040138C                   |.  DFE0          FSTSW AX
0040138E                   |.  9E            SAHF
0040138F                   |.  75 07         JNZ SHORT zebrone.00401398
00401391                   |.  31C0          XOR EAX,EAX
00401393                   |.  E9 96000000   JMP zebrone.0040142E
00401398                   |>  DD45 F8       FLD QWORD PTR SS:[EBP-8]
0040139B                   |.  DC5D F0       FCOMP QWORD PTR SS:[EBP-10]
0040139E                   |.  DFE0          FSTSW AX
004013A0                   |.  9E            SAHF
004013A1                   |.  75 07         JNZ SHORT zebrone.004013AA
004013A3                   |.  31C0          XOR EAX,EAX
004013A5                   |.  E9 84000000   JMP zebrone.0040142E
004013AA                   |>  DD45 F8       FLD QWORD PTR SS:[EBP-8]
004013AD                   |.  DD5D C8       FSTP QWORD PTR SS:[EBP-38]
004013B0                   |.  D9E8          FLD1
004013B2                   |.  DD55 C0       FST QWORD PTR SS:[EBP-40]
004013B5                   |.  DC5D C8       FCOMP QWORD PTR SS:[EBP-38]
004013B8                   |.  DFE0          FSTSW AX
004013BA                   |.  9E            SAHF
004013BB                   |.  77 2D         JA SHORT zebrone.004013EA
004013BD                   |.  DF2D 38304000 FILD QWORD PTR DS:[403038]
004013C3                   |.  DD55 B8       FST QWORD PTR SS:[EBP-48]
004013C6                   |.  DC5D C8       FCOMP QWORD PTR SS:[EBP-38]
004013C9                   |.  DFE0          FSTSW AX
004013CB                   |.  9E            SAHF
004013CC                   |.  72 1C         JB SHORT zebrone.004013EA
004013CE                   |.  DD45 F0       FLD QWORD PTR SS:[EBP-10]
004013D1                   |.  DD5D B0       FSTP QWORD PTR SS:[EBP-50]
004013D4                   |.  DD45 C0       FLD QWORD PTR SS:[EBP-40]
004013D7                   |.  DC5D B0       FCOMP QWORD PTR SS:[EBP-50]
004013DA                   |.  DFE0          FSTSW AX
004013DC                   |.  9E            SAHF
004013DD                   |.  77 0B         JA SHORT zebrone.004013EA
004013DF                   |.  DD45 B8       FLD QWORD PTR SS:[EBP-48]
004013E2                   |.  DC5D B0       FCOMP QWORD PTR SS:[EBP-50]
004013E5                   |.  DFE0          FSTSW AX
004013E7                   |.  9E            SAHF
004013E8                   |.  73 04         JNB SHORT zebrone.004013EE
004013EA                   |>  31C0          XOR EAX,EAX
004013EC                   |.  EB 40         JMP SHORT zebrone.0040142E
004013EE                   |>  DD45 F8       FLD QWORD PTR SS:[EBP-8]
004013F1                   |.  D9FE          FSIN
004013F3                   |.  DD5D A8       FSTP QWORD PTR SS:[EBP-58]
004013F6                   |.  DD45 F0       FLD QWORD PTR SS:[EBP-10]
004013F9                   |.  D9FE          FSIN
004013FB                   |.  DD5D A0       FSTP QWORD PTR SS:[EBP-60]
004013FE                   |.  DD45 A8       FLD QWORD PTR SS:[EBP-58]
00401401                   |.  DC4D A0       FMUL QWORD PTR SS:[EBP-60]
00401404                   |.  DF2D 30304000 FILD QWORD PTR DS:[403030]
0040140A                   |.  DEC9          FMULP ST(1),ST
0040140C                   |.  83EC 08       SUB ESP,8
0040140F                   |.  DD1C24        FSTP QWORD PTR SS:[ESP]
00401412                   |.  E8 D1000000   CALL <JMP.&CRTDLL.floor>
00401417                   |.  83C4 08       ADD ESP,8
0040141A                   |.  DD5D 98       FSTP QWORD PTR SS:[EBP-68]
0040141D                   |.  D9EE          FLDZ
0040141F                   |.  DC5D 98       FCOMP QWORD PTR SS:[EBP-68]
00401422                   |.  DFE0          FSTSW AX
00401424                   |.  9E            SAHF
00401425                   |.  75 05         JNZ SHORT zebrone.0040142C
00401427                   |.  31C0          XOR EAX,EAX
00401429                   |.  40            INC EAX
0040142A                   |.  EB 02         JMP SHORT zebrone.0040142E
0040142C                   |>  31C0          XOR EAX,EAX
0040142E                   |>  C9            LEAVE
0040142F                   \.  C3            RETN
穿越星空
发表于 2009-10-17 21:16:00 | 显示全部楼层
  这么专业的问题,还是去看雪问问吧。
prawnliu
 楼主| 发表于 2009-10-17 22:52:28 | 显示全部楼层
看雪没有邀请码……
新手交流区八辈子没人理……
穿越星空
发表于 2009-10-18 10:12:46 | 显示全部楼层

回复 3楼 prawnliu 的帖子

  看雪要邀请码的?我倒是有号,不过既然没人理就算了,本来想帮你去问下的。
  那楼主去飘云阁看看。

[ 本帖最后由 穿越星空 于 2009-10-18 10:14 编辑 ]
bugman
发表于 2009-10-18 11:05:25 | 显示全部楼层
关于浮点数的操作,不好一下子讲清楚,最好自己调试过才知道。
用OD调试的时候,请仔细观察浮点寄存器,既然楼主会使用OD,这个想必楼主应该也是知道的吧。切换寄存器方式,切换到FPU,然后仔细观察他的寄存器状态,就是ST0~ST7.
简单的说几条指令:
FLD跟FILD,前者是把值按浮点数取出来,然后压栈,这里的压栈是指压入栈顶ST0,他的堆栈是ST0~ST7,如压栈后原来的ST1变现在的ST2等;后者是取整数,然后压栈。
举个楼主代码里的例子:
00401398                   |>  DD45 F8       FLD QWORD PTR SS:[EBP-8]
意思是把[EBP-8]里存储的内容,按浮点的形式,压到栈顶ST0中。

FSTP跟FISTP,这个和前面的指令相反,前者是把ST0里的值按浮点方式取出来,并且出栈,这里的出栈类推上面所讲的压栈,自己理解吧。后者是按整数的形式取出来,其他的都一样。
举个例子:
00401377                   |.  DD1C24        FSTP QWORD PTR SS:[ESP]
该指令把ST0里的内容,按浮点的形式存放到SS:[ESP]中,然后出栈。

其他的指令按照字面的意思理解下就好了,只不过命名时前面加了个F罢了。
比如FCOM,ST0浮点数和ST1浮点数比较,FICOM也是ST0和ST1比较,只是是按整数形式的。
FCOMP不仅有FCOM的功能,ST0和ST1比较,按浮点形式,并出栈
举例你代码中的比较过程:
0040141F                   |.  DC5D 98       FCOMP QWORD PTR SS:[EBP-68] //比较
00401422                   |.  DFE0          FSTSW AX  //浮点状态寄存器送AX
00401424                   |.  9E            SAHF //AX高字节转送到整数标志寄存器的低字节,因为C3,C2,CO正好对应ZF,PF,CF
00401425                   |.  75 05         JNZ SHORT zebrone.0040142C //不相等则回跳

还有比如FADD加,FSUB减,FMUL乘,FDIV除等等。其他的按字面意思基本上都可以了解的,不懂的,单独百度下,或者观察浮点寄存器。总之调试过程中仔细看浮点寄存器,边调试边自己也计算,多跟几个程序,基本上就理解意思了。

评分

参与人数 1经验 +5 收起 理由
淘金者 + 5 感谢解答: )

查看全部评分

prawnliu
 楼主| 发表于 2009-10-18 11:39:30 | 显示全部楼层

回复 5楼 bugman 的帖子

感谢解答
很有帮助!
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-7-1 01:22 , Processed in 0.127759 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表