2015-03-06 3 views
0

Я пишу программу, используя gcc расширенный встроенный код сборки, чтобы написать программу, которая вычисляет один из квадратичных корней (из квадратичной формулы). Я написал все мой код, и я постоянно встречая следующее сообщение об ошибке:Расширенная встроенная сборка gcc - вычисление квадратичных корней формулы

«недействителен„ASM“: операнд номер отсутствует после% -Письма»

Я получаю эту ошибку в 7 раз, когда я пытаюсь скомпилировать моя программа. Мой главный вопрос: что это значит и почему это происходит? Это домашнее задание, поэтому я не прошу решения как такового, но я просто не могу понять, что это сообщение об ошибке означает, с какими частями моего кода он применяется (переменные, я думаю ? прямо сейчас)

вот мой код:

#include <stdio.h> 

#include <stdlib.h> 

#include <math.h> 


// function for checking that your assembly code is computing the correct result 


double quadraticRootC(double a, double b, double c) 

{ 

     return (-b + sqrt(b * b - 4 * a * c))/(2 * a); 

} 


double quadraticRoot(double a, double b, double c) 

{ 

// write assembly code below to calculate the quadratic root 

     double root; 

     asm(
       "fld  %a    \n" 
       "fadd  %%ST   \n" 
       "fld  %a    \n" 
       "fld  %c    \n" 
       "fmulp  %%ST(1)   \n" 
       "fadd  %%ST   \n" 
       "fadd  %%ST   \n" 
       "fchs      \n" 
       "fld  %b    \n" 
       "fld  %b    \n" 
       "fmulp  %%ST(1)   \n" 
       "faddp  %%ST(1)   \n" 
       "ftst      \n" 
       "fstsw  %%AX   \n" 
       "sahf      \n" 
       "fsqrt      \n" 
       "fld  %b    \n" 
       "fchs      \n" 
       "fdivp  %%ST(1)   \n" 
       "mov  %root, %%eax \n" 
       "fstp  %%qword, %%eax \n" 
       "mov  $1, %%eax  \n" 
       "jmp  short done  \n" 
       "done:      \n" 
       :"=g"(root) 
       :"g"(a), "g"(b), "g"(c) 
       :"eax" 
      ); 
     return(root); 
} 

int main(int argc, char **argv) 
{ 
    double a, b, c; 
    double root, rootC; 

    printf("CS201 - Assignment 2p - Hayley Howard\n"); // print your own name instead 
    if (argc != 4) 
    { 
     printf("need 3 arguments: a, b, c\n"); 
     return -1; 
    } 
    a = atof(argv[1]); 
    b = atof(argv[2]); 
    c = atof(argv[3]); 
    root = quadraticRoot(a, b, c); 
    rootC = quadraticRootC(a, b, c); 

    printf("quadraticRoot(%.3f, %.3f, %.3f) = %.3f, %.3f\n", a, b, c, root, rootC); 

    return 0; 
} 

ответ

0

Вы должны использовать число операндов, а не имена в инлайн ассемблере. Просто замените %root с %0, %a с %1, %b с %2 т.д.

Посмотрите here для более подробной информации.

2

Если вы хотите использовать символические имена в инлайн ассемблере, вам необходимо заново определить их в ограничениях:

: [root] "=g"(root) 
: [a] "g"(a), [b] "g"(b), [c] "g"(c) 

Затем ссылаться на них в коде, вы должны использовать% [корень],% [a] и т. д. Говоря о себе, я нахожу имена намного легче читать, чем% 0,% 1 и т. д. Кроме того, во время разработки/тестирования вы можете добавлять/удалять параметры, что заставило бы вас переработать все ваши операнды в asm, что является настоящей болью.

Для получения более подробной информации см. here.

+0

Не знаю, спасибо. –

Смежные вопросы