当前位置: 技术问答>linux和unix
谁能帮我解释下这段代码
来源: 互联网 发布时间:2015-12-16
本文导语: 这就是一段memcpy()的底层实现代码,谁能帮我解释下,特别是这里面为什么操作数只有%4出现了,其他的都不需要么,另外求一份AT&T的汇编资料。 static inline void *__memcpy(void * to , const void * from , size_t n) { ...
这就是一段memcpy()的底层实现代码,谁能帮我解释下,特别是这里面为什么操作数只有%4出现了,其他的都不需要么,另外求一份AT&T的汇编资料。
static inline void *__memcpy(void * to , const void * from , size_t n)
{
int d0,d1,d2;
__asm__ __volatile__(
"rep ; movslnt"
"testb $2,%b4nt"
"je 1fnt"
"movswn"
"1:ttestb $1,%b4nt"
"je 2fnt"
"movsbn"
"2:"
:"=&c"(d0),"&=&D"(d1),"=&S"(d2)
:"0"(n/4),"q"(n),"1"((long) to),"2"((long) from)
:"memory");
return(to);
}
static inline void *__memcpy(void * to , const void * from , size_t n)
{
int d0,d1,d2;
__asm__ __volatile__(
"rep ; movslnt"
"testb $2,%b4nt"
"je 1fnt"
"movswn"
"1:ttestb $1,%b4nt"
"je 2fnt"
"movsbn"
"2:"
:"=&c"(d0),"&=&D"(d1),"=&S"(d2)
:"0"(n/4),"q"(n),"1"((long) to),"2"((long) from)
:"memory");
return(to);
}
|
因为
:"=&c"(d0),"&=&D"(d1),"=&S"(d2)
:"0"(n/4),"q"(n),"1"((long) to),"2"((long) from)
n/4就到ecx中了,to到edi, from到esi中了。上面的“0”“1”“2”表示输出位置上对应位置的寄存器。所以在代码中就无需赋值了。
上面代码的大概意思是:先按照一个双字一个双字拷贝,再一个字一个字拷贝,最后如果有多出一个字节就拷贝最后一个字节。这样做的原因是:一个双字一个双字的拷贝效率要高
至于资料,可以看看我在实用资料区已解决问题里的一个贴子:
http://community.csdn.net/Expert/topic/4766/4766185.xml?temp=.9432947
:"=&c"(d0),"&=&D"(d1),"=&S"(d2)
:"0"(n/4),"q"(n),"1"((long) to),"2"((long) from)
n/4就到ecx中了,to到edi, from到esi中了。上面的“0”“1”“2”表示输出位置上对应位置的寄存器。所以在代码中就无需赋值了。
上面代码的大概意思是:先按照一个双字一个双字拷贝,再一个字一个字拷贝,最后如果有多出一个字节就拷贝最后一个字节。这样做的原因是:一个双字一个双字的拷贝效率要高
至于资料,可以看看我在实用资料区已解决问题里的一个贴子:
http://community.csdn.net/Expert/topic/4766/4766185.xml?temp=.9432947