1 Linux 0.12内核中strncmp函数的实现
extern inline int strncmp(const char * cs,const char * ct,int count)
{
register int __res __asm__("ax");
__asm__("cld\n"
// 将标志寄存器Flag的方向标志位DF清零。在字串操作中使变址寄存器SI或DI的地址指针自动增加,字串处理由前往后
"1:\tdecl %3\n\t" // 将count的值减1,此处为标号1
"js 2f\n\t" // 如果count-1的值小于0则跳转到标号2(f代表向前,b代表向后)
"lodsb\n\t" // 取串2的字符ds:[esi] -> al, 并且esi++
"scasb\n\t" // 比较al与串1的字符es:[edi],并且edi++
"jne 3f\n\t" // 如果不相等就跳转到标号3
"testb %%al,%%al\n\t"
// test执行的就是and的指令,只不过不会保存and执行的结果,而是根据and的结果设置flags寄存器的各种标志
// 这里可以用来判断是不是空字符
"jne 1b\n" // 如果ZF标志位不为0跳转到标号1(即不为空指针)
"2:\txorl %%eax,%%eax\n\t" // 是空字符则清空eax
"jmp 4f\n" // 跳转到标号4
"3:\tmovl $1,%%eax\n\t" // 不想等则将eax置1
"jl 4f\n\t" // 如果串2的字符小于串1,则跳转到标号4,即应该返回结果1
"negl %%eax\n" // 将eax的值取反
"4:"
:"=a" (__res):"D" (cs),"S" (ct),"c" (count):"si","di","cx");
return __res;
}
可以看出该程序并未考虑空指针的情形。