内嵌汇编函数分析

来源:互联网 发布:微邦软件下载 编辑:程序博客网 时间:2024/06/10 17:54

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;}

可以看出该程序并未考虑空指针的情形。

原创粉丝点击