首页
社区
课程
招聘
关于浮点指令的奇偶效验位
发表于: 2010-11-26 13:26 3705

关于浮点指令的奇偶效验位

2010-11-26 13:26
3705
小弟俺最近在逆向一个小程序,不过里面有很多FPU的指令,常常IDA不能形成正确C代码,于是只有自己看汇编。不过调用FPU的比较指令后,程序总是会检测C2标志,这个标志应该是等同于程序的奇偶效验标志吧,但这个标志有啥用呢
比如如下代码

024 fcomp   ds:dbl_10013170
024 fnstsw  ax
024 test    ah, 5
024 jp      short loc_1000463F   ;大于跳

test    ah, 5就是检测FPU status寄存器的C2 跟C0,这两个位分别对应为PF 跟CF标志。
程序如果检测到两个标志都置位则会跳转。

我在INTEL手册上查到如下说明:
PF (bit 2) Parity flag - Set if the least-significant byte of the result contains an even number of 1 bits; cleared otherwise. cleared oth
大致是说如果结果中的最低有效字用一个位表示一个事件号码则置位,否则清零。不过没看明白

我不清楚的就是这个C2(pf)在此置位表示什么意思呢

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
奇偶标志位:PF(parity flag)   在汇编语言中,当逻辑运算结果中1的个数为偶数时,PF=1;为奇数时,PF=0。

JG  ;有符号大于则跳转 
跳转应该和PF没关系吧
2010-11-26 17:19
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
貌似有点什么关系,我在INTEL手册找到了一部分资料,手册在判断大于小于时候仅仅只会检测C0(CF),判断等于时只会看C3(ZF),但是我逆向的那个程序总是会检测C2(pf),而且貌似还有点影响

00C fcomp   ds:dbl_100132D8
00C fnstsw  ax
00C test    ah, 1
00C jnz     short loc_100033F5 ;小于则跳
不为0则跳,则CF=0;CF=0则AH最低位为1,则C0为1,C0为1即借位表示小于

024 fcomp   ds:dbl_10013170
024 fnstsw  ax
024 test    ah, 5
024 jp      short loc_1000463F   ;大于跳
这个C2跟C0同时置位就跳吧,而C0是CF,按理说应该是表示小于啊,但是多了一个C2后这里却表示等于则跳????

024 fld     a
024 fcom    b
024 fnstsw  ax
024 test    ah, 41h
024 jnz     short loc_1000462D ; 小于等于则跳
C3(ZF)或C0(CF)任意一个置位就跳,即等于或小于

00C fld     ds:dbl_10013170
00C fld     [ecx]
00C fucompp
00C fnstsw  ax
00C test    ah, 44h
00C jnp     short loc_10003410 ; 等于则跳
C3(ZF)或C2(PF)一个置位才跳,如果仅仅C2置位是什么意思呢????
2010-11-26 20:32
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
根据INTEL手册:
FCOM/FCOMP/FCOMPP 结果
情况 C3 C2 C0
ST(0) > SRC 0 0 0
ST(0) < SRC 0 0 1
ST(0) = SRC 1 0 0
Unordered* 1 1 1

test ah,5
jp xxx
两条指令相当于检测ah的第0位和第2位是否相同,也就等于检测C0和C2是否相同,而根据上面的说明,C0和C2只有在 ST(0)<SRC时不同,因此jp执行转移的条件是ST(0)>SRC或ST(0)=SRC或Unordered,或者说,jp后面的指令执行条件是ST(0)<SRC。
2010-11-26 21:01
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
明白了,俺英文不好,下午看了半天手册硬是没搞明白,谢了
我还一直当成两个标志都会被置位呢,忽略的两者为0的情况,原来是检测两个标志是否相同
2010-11-26 21:34
0
游客
登录 | 注册 方可回帖
返回
//