с плавающей точкой - абсолютное значение - встроенная сборка - редактируется новый код - PullRequest
1 голос
/ 15 февраля 2010

Я написал функцию с именем 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 ]

2 голосов
/ 03 ноября 2010

Это полностью работает .. !! Вы просто забыли поместить значения в argv. Вы можете запустить программу примерно так:

. / A3 -1,3

и должно возвращаться 1,3

Вы закончили, прежде чем опубликовать это здесь ...

2 голосов
/ 15 февраля 2010

fld (%eax) означает «загрузить поплавок из значения по адресу %eax». Очевидно, что содержимое %eax является двойным, а не указателем на число с плавающей точкой, поэтому вы segfault.

Поскольку вход уже находится в стеке (следовательно, у него есть адрес), нет необходимости прыгать через обручи, перемещая вещи вокруг.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...