[英]floating point - absolute value - inline assembly - edited new code
我寫了一個名為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
~ $
沒有輸出它的絕對值...謝謝..
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
。
它完全正常工作.. !! 你只是忘了把值放到argv。 您可以使用以下內容運行程序:
./a3 -1.3
它應該返回1.3
你在這里發布之前已經完成了......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.