Не выводит ответ, Ассемблерная вставка, код на Си
Написал программу с ассемблерными вставками, но ответ не выводит, вместо нее - ошибка как на фото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); //вывод значений
}
}
