本文要点
- strcmp函数是什么
- strcmp函数的反汇编分析
一、strcmp函数是什么
strcmp函数是C/C++语言中的一个字符串比较函数。
其格式为: strcmp(str1,str2)//str1/str2均为字符串指针,返回值为0 1 -1。
其原理是:
将两个字符串的字符一个一个字符的比较,若完全一样,则返回0
如果遇到不一样的字符分为一下两种情况:
1.前者大于后者:返回1
2.前者小于后者:返回-1
二、strcmp函数的反汇编分析
1.PNG上图就是strcmp函数的反汇编代码,下面让我们来一步一步分析吧!
图中 73F52800行 到 73F22848行就是完整的strcmp函数的反汇编代码
第一步是将str1和str2的首地址赋值给edx和ecx(图2)
第二步是检测str1的首地址是否为4的倍数,如果不是就要跳转去另一段代码将字符串的地址比较到4的倍数再返回来(我也暂时没想通为什么要这样做,各位大佬想到了告诉小弟一下)
3.PNG 跳转去的代码(这段代码的逻辑就是对比str1 str2 直到str1的首地址为4的倍数): 4.PNG第三步是将str1的首四个字节(其实是以edx开始的四个字节)赋值给eax
5.PNG第四步开始正式的比较了 al存放的是第一个字节,至于为什么这里就是不再赘述了,不懂了回去看看汇编语言
将al与str2的第一个字节相比较(地址ecx所在的字节)
如果不等于就跳转到 73F52844 这里,待会再解释 73F52844 这里的代码是干什么用的,但是我们可以猜想一下一定是决定返回 1 还是返回 -1 的代码
然后会判断一下字符串str1是不是结束了(字符串以 0 结尾) ,如果结束了直接跳转到返回 0 的代码 73F52844 6.PNG
第五步跟第四步类似 比较以edx开始第二个字符
第七步是将eax中高16位的两个字符移动到低16位来,然后继续重复 五 六步 的动作
第八步是给edx 和 ecx 都加 4,如果第四个字符不等于0 ,那就跳转到第三步继续做比较
结果
我们可以看到比较的结果可以在两处返回
1、若str1 执行到结束字符 0 的位置,说明 此时的 str2 也是 等于 0(如果不等的话,前面两者的比较就会跳转),那么程序就会跳转到以下代码,eax作为返回值 置位 0
2、如果是两个字符对比不相等,就会跳转到如下代码:
先来述说 sbb 的用法 ,sbb eax,eax 等价于 eax = eax - eax -cf
CF 是进位/借位标志符
在跳转之前 我们进行了 cmp a,b
-
如果是 a < b,CF因为借位置 1
那么:
sbb eax,eax --> eax = FFFF
shl eax,1 --> eax =FFFE
add eax,1 -->eax = FFFF
也就是说 eax = -1D(十进制补码表示) -
如果a>b
那这一段代码执行下来
eax = 1(十进制)
网友评论