浮点 - 绝对值 - 内联汇编 - 编辑的新代码

时间:2010-02-15 05:05:33

标签: c assembly

我写了一个名为absD的函数,我希望返回其参数的绝对值。 我正在使用GCC内联汇编与cygwin ..

我不明白为什么它不起作用。我加载到内存中。然后进入st(0) 我在哪里使用fabs - 绝对值。我必须分配内存吗?

我正在尝试用C学习装配,所以请你好。请给我很好的帮助。 谢谢

继承代码,然后是错误:

#include <stdio.h>
#include <stdlib.h>
#define PRECISION   3

double absD (double n)
{


asm(
        "fldl %[nIn]\n"
        "fabs\n"
        "fstpl %[nOut]\n"
        : [nOut] "=m" (n)
        : [nIn] "m" (n)
);



return n;


}

int main (int argc, char **argv)
{
double  n = 0.0;

printf("Absolute value\n");
if (argc > 1)
    n = atof(argv[1]);

printf("abs(%.*f) = %.*f\n", PRECISION, n, PRECISION, absD(n));

return 0;
}

这是输出:

~ $ gc a3
gcc -Wall -g a3.c -o a3
~ $ ./a3
Absolute value
abs(0.000) = 0.000
~ $

不输出其绝对值... 谢谢..

2 个答案:

答案 0 :(得分:2)

fld (%eax)表示“从地址%eax的值加载浮点数”。显然,%eax的内容是double,而不是指向float的指针,这就是你的段错误。

由于输入已经在堆栈上(因此它有一个地址),所以没有必要跳过环路来移动东西。

double absD(double input) {
    double output;
    asm(
            "fldl %[input]\n"
            "fabs\n"
            "fstpl %[output]\n"
            : [output] "=m" (output)
            : [input] "m" (input)
    );
    return output;
}

另外,您的printf格式错误:%f表示float,但您要给它double;你想使用%g

答案 1 :(得分:2)

它完全正常工作.. !!你只是忘了把值放到argv。您可以使用以下内容运行程序:

./ a3 -1.3

它应该返回1.3

你在发布之前已经完成了......