安庆

导航

一小段测试atof的代码

#include <stdio.h>
//#include <stdlib.h>

double a=0;
int main(int argc, char *argv[])
{
    a = atof(argv[1]);
    double b=a+2;

    printf("b = %f\n", b);
    printf("a = %f\n", a);

    return 0;
}

  不管是否把注释的//放开,都能编译链接正常,把注释的//打开,atof的行为则正常,否则异常。

也就是说atof存在两个定义,一个正确实现,一个没有实现?咨询了一个做工具链的同事,他的结论是:

反汇编对比两个生成的代码,发现返回值的问题,正常的返回是float,异常的是返回0,也就是异常使用的是eax寄存器,而

atof的实现,它的返回值不是在eax中的,是在xmm0中。

其实真正的原因是:带了头文件包含stdlib.h,则会根据函数声明,生成正确的调用代码,否则就会默认地使用eax作为返回值的寄存器。

posted on 2018-07-26 14:15  _备忘录  阅读(187)  评论(0编辑  收藏  举报