免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2066 | 回复: 8
打印 上一主题 下一主题

[算法] 请大牛们帮忙解释一下这段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-14 09:55 |只看该作者 |倒序浏览
这个是从微软的CRT中找到得strlen的代码片段,谁大牛们帮忙解释一下这段代码,谢谢

  1.         ; 上面保证ecx 是4字节对齐,ecx中存放的是字符串指针
  2.         mov     eax,dword ptr [ecx]     ; read 4 bytes
  3.         mov     edx,7efefeffh
  4.         add     edx,eax
  5.         xor     eax,-1
  6.         xor     eax,edx
  7.         add     ecx,4
  8.         test    eax,81010100h
  9.         je      short main_loop

  10.         ;执行到这里就证明4个字节中包含0的字节,为什么??
复制代码
这段代码实在是看不明白,但是编译器这么实现了应该是因为其效率高吧,求解

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2011-03-14 10:05 |只看该作者
每条代码在纸上写一下就明白了

论坛徽章:
0
3 [报告]
发表于 2011-03-14 10:10 |只看该作者
i1=(uint32)/* 整型 */;

i2 = i1+0x7efefeff;
i1 ^= -1;
i1 ^= i2;

i1 ^ 0x81010100;  //如果 i1 中原来不包含 0 字节则为0

代码明白,不明白为什么

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
4 [报告]
发表于 2011-03-14 10:11 |只看该作者
本帖最后由 egmkang 于 2011-03-14 10:19 编辑

# define MKW(x) (x|x<<8|x<<16|x<<24)
判断l里面有没有0:
((l - MKW(0x1ul)) & ~l) & MKW(0x80ul)

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2011-03-14 10:16 |只看该作者
本帖最后由 amarant 于 2011-03-14 10:26 编辑

我粗略看了下

     mov     eax,dword ptr [ecx]     ; read 4 bytes
        mov     edx,7efefeffh
        add     edx,eax       ;这句话加上以后,如果有0字节的,就会导致有一个字节不进位
        xor     eax,-1     
        xor     eax,edx   
        add     ecx,4
        test    eax,81010100h
        je      short main_loop

论坛徽章:
0
6 [报告]
发表于 2011-03-14 10:24 |只看该作者
明白了,谢谢几位了
这个实现还真犀利,受教了

论坛徽章:
0
7 [报告]
发表于 2011-03-14 10:34 |只看该作者
我来学习一下啊。。。

论坛徽章:
0
8 [报告]
发表于 2011-03-14 10:37 |只看该作者

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
9 [报告]
发表于 2011-03-14 10:44 |只看该作者
jzgnh 发表于 2011-03-14 10:37


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP