首页
社区
课程
招聘
奇怪的反汇编代码
发表于: 2010-2-7 15:44 7352

奇怪的反汇编代码

2010-2-7 15:44
7352
先看一段C代码:
BOOL Func(char *s1, char *s2)
{
if (lstrcmpA(s1, s2) == 0)
{
return TRUE;
}
return FALSE;
}


反汇编后是这样的
00401480  /$  8B4424 08     mov     eax, dword ptr [esp+8]
00401484  |.  8B4C24 04     mov     ecx, dword ptr [esp+4]
00401488  |.  50            push    eax                              ; /String2
00401489  |.  51            push    ecx                              ; |String1
0040148A  |.  FF15 00204000 call    dword ptr [<&KERNEL32.lstrcmpA>] ; \lstrcmpA
00401490  |.  F7D8          neg     eax
00401492  |.  1BC0          sbb     eax, eax
00401494  |.  40            inc     eax
00401495  \.  C3            retn
00401496      90            nop


我有点搞不懂,为什么不是下面这样的呢?
00401480  /$  8B4424 08     mov     eax, dword ptr [esp+8]
00401484  |.  8B4C24 04     mov     ecx, dword ptr [esp+4]
00401488  |.  50            push    eax                              ; /String2
00401489  |.  51            push    ecx                              ; |String1
0040148A  |.  FF15 00204000 call    dword ptr [<&KERNEL32.lstrcmpA>] ; \lstrcmpA
00401494  |.  40            inc     eax
00401495  \.  C3            retn
00401496      90            nop


干嘛要neg 对eax取反
然后再 sbb
直接 eax++ 不是一样的吗?

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

收藏
免费 3
支持
分享
最新回复 (19)
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
我又来了
你的实现有问题,当lcmpstrA返回的不为0的时候,按理来说这个函数要返回0,但你的方法就不会返回0吧
2010-2-7 15:53
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
lstrcmp 不是只会传回 0 ' 1
而是 正数 ' 零 ' 负数 三种
上面的写法可使得 只有 EAX=零 时, 才能 ret EAX=1
EAX= 正数 or 负数 时 , ret EAX=0
2010-2-7 15:56
0
雪    币: 424
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
膜拜ls大牛,我不敢要分了
2010-2-7 15:59
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
6 ' 4 分帐
2010-2-7 16:00
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
谁6谁4啊?
晕  

我好像懂了

eax作为strcmp的返回值
当eax=0时  要返回1
当eax为其他时  要返回0
我的逻辑是错误的

但是有一点不懂,那个neg是干嘛的 去掉 neg eax这句不也很完美吗?
2010-2-7 16:06
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
neg 是为了要设 CF 旗号

因为 sbb 指令是 A - B - CF

sbb eax, eax  =>  0 - CF
2010-2-7 16:09
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
懂了  膜拜2位 大牛! 5,5分吧   万一你们俩打架多不好!
2010-2-7 16:11
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
ok
123
2010-2-7 16:13
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
补充点汇编基础知识吧
neg指令详细解释
规则:1. neg reg (对寄存器操作)
   2. neg mem(对内存操作)
作用:将目的操作数的所以数据位取反加1
影响的标志:进位标志(CF),零标志(ZF),符合标志(SF),溢出标志(OF),辅助进位标志(AF),奇偶标志(PF)
当操作数为0时,置CF位为0
当操作数不为0时,置CF位为1


sbb指令
sbb a,b => a=a-b-CF


所以对开始那段反汇编的解释就是这样的:
先neg一下,
①如果是eax = 0
则CF=0
sbb eax,eax后 eax=0
inc eax后 eax =1
最后eax=1,返回1
②如果eax !=0,
则CF=1
sbb eax,eax后eax=0xFFFFFFFF
inc eax后eax=0
最后eax=0,返回0


连接:http://hi.baidu.com/blueapple_c/blog/item/e795492bf89db2335243c1f7.html
2010-2-7 16:19
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
哦。Apple兄这个问题很好,我有些茅塞顿开了
2010-2-10 22:18
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
12
能对你有帮助,我很开心,哈哈。。。
2010-2-10 23:55
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
13
你是女生 ?
2010-2-11 00:41
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
大哥眼力不错
2010-2-11 00:41
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
15
请喊我美女!  
ps.  S大是我妹妹 ,虽然没我俊。。。

Go on ps:为什么在我的笔记本上看我的头像挺正常的,在公司这个CRT显示器上怎么就这么黑?
2010-2-11 09:14
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
16
电灯要开..
上传的附件:
2010-2-11 11:37
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
哇塞,又发现一个美女~~
2010-2-11 15:35
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
18
咳咳。。。不能再水了昂
2010-2-11 18:48
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
1.你的笔记本太亮了。
2.你公司的笔记本太暗了。
3.你不给我加分。
4.人品问题。
2010-2-16 21:56
0
雪    币: 154
活跃值: (213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢解答  我也懂了
2023-5-10 17:49
0
游客
登录 | 注册 方可回帖
返回
//