内嵌汇编函数分析

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值