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