首页
社区
课程
招聘
[求助]请帮忙看看这个函数的汇编功能。含部分浮点运算
发表于: 2013-10-1 21:08 6917

[求助]请帮忙看看这个函数的汇编功能。含部分浮点运算

2013-10-1 21:08
6917
我看了一下,有两句: fstsw ax    test ah,0x1,  这不就是测试第8位TF的么》? 是不是函数包含有反跟踪呢? 还是怎么回事??
关键是包含浮点运算,不是太熟悉。。。。。。求大神看一下,给予指导啊

009396BB    05 CCCCCCCC     add eax,0xCCCCCCCC
009396C0    D9EE            fldz
009396C2    56              push esi
009396C3    8BF1            mov esi,ecx
009396C5    DC96 A0060000   fcom qword ptr ds:[esi+0x6A0]
009396CB    DFE0            fstsw ax
009396CD    D94424 08       fld dword ptr ss:[esp+0x8]
009396D1    F6C4 01         test ah,0x1
009396D4    0F85 08010000   jnz [XXXXXX].009397E2

009396DA    D9C9            fxch st(1)
009396DC    DC9E 98060000   fcomp qword ptr ds:[esi+0x698]
009396E2    DFE0            fstsw ax
009396E4    F6C4 01         test ah,0x1
009396E7    0F85 D8000000   jnz [XXXXXX].009397C5
009396ED    DDD8            fstp st
009396EF    DD86 60060000   fld qword ptr ds:[esi+0x660]
009396F5    DC9E 80060000   fcomp qword ptr ds:[esi+0x680]
009396FB    DFE0            fstsw ax
009396FD    F6C4 41         test ah,0x41
00939700    75 42           jnz short [XXXXXX].00939744
00939702    DB86 78060000   fild dword ptr ds:[esi+0x678]
00939708    DC86 80060000   fadd qword ptr ds:[esi+0x680]
0093970E    DD96 80060000   fst qword ptr ds:[esi+0x680]
00939714    DC9E 60060000   fcomp qword ptr ds:[esi+0x660]
0093971A    DFE0            fstsw ax
0093971C    F6C4 41         test ah,0x41
0093971F    75 0C           jnz short [XXXXXX].0093972D
00939721    DD86 60060000   fld qword ptr ds:[esi+0x660]
00939727    DD9E 80060000   fstp qword ptr ds:[esi+0x680]
0093972D    DD86 70060000   fld qword ptr ds:[esi+0x670]
00939733    DC9E 80060000   fcomp qword ptr ds:[esi+0x680]
00939739    DFE0            fstsw ax
0093973B    F6C4 44         test ah,0x44
0093973E    7A 66           jpe short [XXXXXX].009397A6
00939740    6A 01           push 0x1
00939742    EB 53           jmp short [XXXXXX].00939797
00939744    DD86 60060000   fld qword ptr ds:[esi+0x660]
0093974A    DC9E 80060000   fcomp qword ptr ds:[esi+0x680]
00939750    DFE0            fstsw ax
00939752    F6C4 05         test ah,0x5
00939755    7A 4F           jpe short [XXXXXX].009397A6
00939757    DB86 78060000   fild dword ptr ds:[esi+0x678]
0093975D    DCAE 80060000   fsubr qword ptr ds:[esi+0x680]
00939763    DD96 80060000   fst qword ptr ds:[esi+0x680]
00939769    DC9E 60060000   fcomp qword ptr ds:[esi+0x660]
0093976F    DFE0            fstsw ax
00939771    F6C4 05         test ah,0x5
00939774    7A 0C           jpe short [XXXXXX].00939782
00939776    DD86 60060000   fld qword ptr ds:[esi+0x660]
0093977C    DD9E 80060000   fstp qword ptr ds:[esi+0x680]
00939782    DD86 68060000   fld qword ptr ds:[esi+0x668]
00939788    DC9E 80060000   fcomp qword ptr ds:[esi+0x680]
0093978E    DFE0            fstsw ax
00939790    F6C4 44         test ah,0x44
00939793    7A 11           jpe short [XXXXXX].009397A6
00939795    6A FF           push -0x1
00939797    68 D0A9A100     push [XXXXXX].00A1A9D0                       ; ASCII "%d"
0093979C    6A 30           push 0x30
0093979E    E8 BDE20200     call [XXXXXX].00967A60
009397A3    83C4 0C         add esp,0xC
009397A6    DD86 90060000   fld qword ptr ds:[esi+0x690]
009397AC    51              push ecx
009397AD    DD9E 98060000   fstp qword ptr ds:[esi+0x698]
009397B3    8BCE            mov ecx,esi
009397B5    D94424 0C       fld dword ptr ss:[esp+0xC]
009397B9    D91C24          fstp dword ptr ss:[esp]
009397BC    E8 3FBA0200     call [XXXXXX].00965200
009397C1    5E              pop esi
009397C2    C2 0400         retn 0x4
009397C5    D9C0            fld st
009397C7    51              push ecx
009397C8    DCAE 98060000   fsubr qword ptr ds:[esi+0x698]
009397CE    8BCE            mov ecx,esi
009397D0    DD9E 98060000   fstp qword ptr ds:[esi+0x698]
009397D6    D91C24          fstp dword ptr ss:[esp]
009397D9    E8 22BA0200     call [XXXXXX].00965200
009397DE    5E              pop esi
009397DF    C2 0400         retn 0x4
009397E2    DDD9            fstp st(1)
009397E4    51              push ecx
009397E5    D9C0            fld st
009397E7    8BCE            mov ecx,esi
009397E9    DCAE A0060000   fsubr qword ptr ds:[esi+0x6A0]
009397EF    DD9E A0060000   fstp qword ptr ds:[esi+0x6A0]
009397F5    D91C24          fstp dword ptr ss:[esp]
009397F8    E8 03BA0200     call [XXXXXX].00965200
009397FD    5E              pop esi
009397FE    C2 0400         retn 0x4

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看不懂。。。。。16进制。
2013-10-1 21:17
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第三列是汇编代码

第一列是地址

第二列是机器码

从OD里面拷贝出来的
2013-10-1 21:18
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
009396BB    05 CCCCCCCC     add eax,0xCCCCCCCC
009396C0    D9EE            fldz                                                                    ; st(0) = 0.0
009396C2    56              push esi
009396C3    8BF1            mov esi,ecx
009396C5    DC96 A0060000   fcom qword ptr ds:[esi+0x6A0]              ; 比较 st(0) 与[esi + 0x6A0] 的双精度浮点数
009396CB    DFE0            fstsw ax                                                           ; 读取比较结果
009396CD    D94424 08       fld dword ptr ss:[esp+0x8]                          ; st(0) = [esp + 0x08] 的单精度浮点数
009396D1    F6C4 01         test ah,0x1                                                     ; if ([esi + 0x6A0] > 0.0)
009396D4    0F85 08010000   jnz [XXXXXX].009397E2
2013-10-1 21:23
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
如果 ecx 是某个指针值的话,可以表达为:

if (Pointer->Fdata > 0.0)
{
       goto 009397E2;
}
2013-10-1 21:25
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
多谢解释了。。。

这个test ah,0x1 是怎么回事呢? 一直没看明白。。。
2013-10-1 21:31
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7

test ah, 0x01 都看不明,那你汇编还看来干嘛
2013-10-1 21:41
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
ax总共是16位,ah是高8位,那么test ah,0x1 就相当于标志位的第8位把(从0开始),第8位是TF位啊。。。  
2013-10-1 21:49
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
你到底有没认真看 4 楼的回复
那是 fstsw ax 指令,读取 x87 FPU 状态寄存器的值,是 fcom 指令比较后的结果
bit 8 是 C0 位(condition code 0,条件码 0)
不是 efalgs 的 TF 位
2013-10-1 22:01
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢耐心指导,以前很少接触FPU的知识,今天结合这个例子,又梳理了一下。。。。。顺便做个总结!!

1) FPU:fpu在cpu内部相对来说是一个较独立的环境,其有状态寄存器、控制寄存器、数据寄存器、标致寄存器

2)有8各80位的数据寄存器,8各寄存器堆栈,ST0在最上面。状态寄存器保存运作结果的状态,例如正负等,控制寄存器16位一般精度控制等,标志寄存器16位,用每2位标志fpu数据寄存器的内容。

3)FPU结果运算的状态,保存在FPU的状态寄存器fstate里面,长度16位,从0开始,第8/10/14位分别为 C0,C2,C3
如果C0=1,C2=0,C3=0,表示st0<source    (fstsw ax    对应test ah,0x1)
如果C0=0,C2=0,C3=0,表示st0>source
如果C0=0,C2=0,C3=1,表示st0=source



通过搜索论坛学到了上述浮点寄存器知识。。。  但是像1搂汇编源代码里面的:

test ah,0x44 ,这个是测试C3和C2,但是我看C2没有1作为结果的啊。。。这个是对应什么结果呢?
test ah,0x41 ,  这个是测试C0和C3,对应的是否结果应该是  <=

感谢额!!!
2013-10-1 22:35
0
游客
登录 | 注册 方可回帖
返回
//