簡體   English   中英

浮點 - 絕對值 - 內聯匯編 - 編輯的新代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM