当前位置: 技术问答>linux和unix
哪位大人能否帮小弟看看?
来源: 互联网 发布时间:2015-04-25
本文导语: 小弟对这个不是很理解,特别是testb 和 sbbl orb 还有__res如何得到值的? static inline int strncmp(const char * cs,const char * ct,size_t count) { register int __res; int d0, d1, d2; __asm__ __volatile__( "1:tdecl %3nt" "js 2fnt" "lodsbnt" "scasbnt"...
小弟对这个不是很理解,特别是testb 和 sbbl orb
还有__res如何得到值的?
static inline int strncmp(const char * cs,const char * ct,size_t count)
{
register int __res;
int d0, d1, d2;
__asm__ __volatile__(
"1:tdecl %3nt"
"js 2fnt"
"lodsbnt"
"scasbnt"
"jne 3fnt"
"testb %%al,%%alnt"
"jne 1bn"
"2:txorl %%eax,%%eaxnt"
"jmp 4fn"
"3:tsbbl %%eax,%%eaxnt"
"orb $1,%%aln"
"4:"
:"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2)
:"1" (cs),"2" (ct),"3" (count));
return __res;
}
|
你这是什么版本的strncmp函数?Glibc里的?不像!内核里的好像不是这样的吧?
以下是2.4.18版内核的strncmp函数,参照着C版本看一看吧
/**
* strncmp - Compare two length-limited strings
* @cs: One string
* @ct: Another string
* @count: The maximum number of bytes to compare
*/
int strncmp(const char * cs,const char * ct,size_t count)
{
register signed char __res = 0;
while (count) {
if ((__res = *cs - *ct++) != 0 || !*cs++)
break;
count--;
}
return __res;
}
以下是2.4.18版内核的strncmp函数,参照着C版本看一看吧
/**
* strncmp - Compare two length-limited strings
* @cs: One string
* @ct: Another string
* @count: The maximum number of bytes to compare
*/
int strncmp(const char * cs,const char * ct,size_t count)
{
register signed char __res = 0;
while (count) {
if ((__res = *cs - *ct++) != 0 || !*cs++)
break;
count--;
}
return __res;
}
|
大致是这样:
"1:tdecl %3nt" 长度减1
"js 2fnt" 为负则转到2:
"lodsbnt" 取1字节
"scasbnt" 比较
"jne 3fnt" 不同转到3:
"testb %%al,%%alnt" 测试串是否结束
"jne 1bn" 未结束转1:
"2:txorl %%eax,%%eaxnt" 置返回值
"jmp 4fn" 转到4:
"3:tsbbl %%eax,%%eaxnt" eax=eax-1
"orb $1,%%aln"
"4:"
"1:tdecl %3nt" 长度减1
"js 2fnt" 为负则转到2:
"lodsbnt" 取1字节
"scasbnt" 比较
"jne 3fnt" 不同转到3:
"testb %%al,%%alnt" 测试串是否结束
"jne 1bn" 未结束转1:
"2:txorl %%eax,%%eaxnt" 置返回值
"jmp 4fn" 转到4:
"3:tsbbl %%eax,%%eaxnt" eax=eax-1
"orb $1,%%aln"
"4:"
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。