灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2182回复:0

一段精彩的汇编代码!

楼主#
更多 发布于:2012-09-10 18:53

无意间在Linux内核中发现这么一段汇编代码,更准确地说应该是gcc内联汇编,写得很精彩,拿出来和大家分享一下。
代码是在include/asm-i386/string.h中,是针对i386对memcpy做进一步优化。我们知道,一个简单的memcpy其实和strcpy差不多,区别只是前者检查的是复制的个数,而后者检查的是当前字符是否是’′。
而这显然还有很大的优化余地,首先像这种非常常用的库函数是可以用汇编重写来提高速度的。当然了,可移植性是降低了,但我们可以针对每个平台写一套汇编。这样速度上的提升还是蛮乐观的。其次,memcpy显然没必要一个一个字节地复制,其实我们最多每次也就复制4个字节(当然是在i386上),但如果复制数量大的话,这种提升还是很明显的。于是下面的汇编就出来乐~!


52_3710_f9c31eb5987579d.jpg[删除]评论如下:
34~36
rep=>重复
movsl=>以long为单位拷贝,从from(%esi)到to(%edi),复制n/4次。别担心,这里是i386。
37~38
恩,用n/4去和n相与。
39
若n/4个4就是全部则完成,跳转到后面的标号,结束。
40
还有剩下的,好,把n%4剩下的一个一个字节地复制。
41~44
这里看不懂的就去学gcc的嵌入汇编语法吧


喜欢0 评分0
游客

返回顶部