Не выводит ответ, Ассемблерная вставка, код на Си

Написал программу с ассемблерными вставками, но ответ не выводит, вместо нее - ошибка как на фотоf

#include<stdio.h>
#include<math.h>
#include<locale.h>
#include<malloc.h>
#include<stdlib.h>

int main ()
{

double r, u, x, y;
double a=-1;
printf("Print X, Y:\n");
if (!(scanf("%lf %lf", &x,&y))) //ввод Х и У + проверка на правильный ввод данных: если не читаются числа, выдает ошибку
{
printf("Error.Try again"); //вывод ошибки
}

else
{
    //определяем и инициализируем указатели
double*X=&x; // в asm(1) будет %1
double*Y=&y; // в asm(1) будет %2
double*R=&r; // в asm(1) будет %0
double*U=&u; // в asm(2) будет %0
double*A=&a; // в asm(2) будет %0

asm // решаем алгоритм r=sqrt(x*x+y*y);
(
".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров
"mov ax, [%1]   \n\t" //Заносим данные в регистр (х)
"mov bx, [%1]   \n\t" //Заносим данные в регистр (х)
"imul ax, bx    \n\t" //Умножаем х*х
"mov cx, [%2]   \n\t" //Заносим данные в регистр (y)
"mov bx, [%2]   \n\t" //Заносим данные в регистр (y)
"imul bx, cx    \n\t" //Умножаем y*y
"add ax, bx     \n\t" //Суммируем х*х и y*y 
"fsqrt           \n\t" // ax,ax //Квадратный корень из (х*х+y*y)
"mov [%0], ax   \n\t" //Вывод данных из регистра
:"=r"(R) //возвращаемые данные(выходные операнды),нумеруются с нуля
:"r"(X),"r"(Y) //Входные данные(продолжение нумерации)
:"%ax","%bx","%cx" //Разрушение регистров
);  
//r=sqrt(x*x+y*y);
if (r==0) //условие, если r=0 - радиус, одна из компонентов полярной системы координат
{
   U=0; 
   printf("R=%lf\n",r);  
  printf("U=%lf\n",u);
};
//U=asin(y/r);
asm // решаем алгоритм asin(y/r);;
(
".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров
"mov ax, [%2]   \n\t" //Заносим данные в регистр (y)
"mov bx, [%1]   \n\t" //Заносим данные в регистр (R) = r из условия выше
"div ax, bx    \n\t" // Делим у на r
"fsin    \n\t" // cx, ax //Sin (y/r)
"mov [%0],ax    \n\t" //cx //Вывод данных из регистра
:"=r"(U) //возвращаемые данные(выходные операнды),нумеруются с нуля
:"r"(R),"r"(Y) //Входные данные(продолжение нумерации)
:"%ax","%bx","%cx" //Разрушение регистров
); 
if ((x<0)&&(y>=0))
{
asm // решаем алгоритм U=M_PI-U (доп. условия с учетом четвертей тригонометрии)
(
".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров
"mov ax, [%2]   \n\t" //Заносим данные в регистр (M_PI) - число pi
"mov bx, [%1]   \n\t" //Заносим данные в регистр (u)

"sub ax, bx    \n\t" //Вычитаем U из M_PI 
"mov [%0], ax   \n\t" //Вывод данных из регистра
:"=r"(U) //возвращаемые данные(выходные операнды),нумеруются с нуля
:"r"(U),"r"(M_PI) //Входные данные(продолжение нумерации)
:"%ax","%bx" //Разрушение регистров
); 
}
else if ((x<0)&&(y<0)) 
{
asm // решаем алгоритм U=(-1)*M_PI-U (доп. условия с учетом четвертей тригонометрии)
(
".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров
"mov ax, [%2]   \n\t" //Заносим данные в регистр (M_PI) - число pi
"mov bx, [%3]   \n\t" //Заносим данные в регистр (a=-1) 
"imul ax, bx    \n\t"  //Умножаем a на M_PI
"mov bx, [%1]   \n\t" //Заносим данные в регистр (u)
"sub ax, bx     \n\t" //Вычитаем из -M_PI U
"mov [%0], ax   \n\t" //Вывод данных из регистра
:"=r"(U) //возвращаемые данные(выходные операнды),нумеруются с нуля
:"r"(U),"r"(M_PI),"r"(A) //Входные данные(продолжение нумерации)
:"%ax","%bx" //Разрушение регистров
); 
};
printf("R=%lf\n",r); //вывод значений
printf("U=%lf\n",u); //вывод значений

}
}

введите сюда описание изображения


Ответы (0 шт):