我写了一个名为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
~ $
不输出其绝对值... 谢谢..
答案 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
你在发布之前已经完成了......