No sinus, Assembler, code for sy
-
I wrote a program, no sinus. I couldn't find a normal description of the syntax rules.
#include <stdio.h> #include<math.h> #include <locale> #include<malloc.h> #include<stdlib.h>
int main() {
float r, u, x, y;
float a = -1;
printf("Print X, Y:\n");
if (!(scanf("%f %f", &x, &y))) //ввод Х и У + проверка на правильный ввод данных: если не читаются числа, выдает ошибку
{
printf("Error.Try again"); //вывод ошибки
} else {
//определяем и инициализируем указатели
float *X = &x; // в asm(1) будет %1
float *Y = &y; // в asm(1) будет %2
float *R = &r; // в asm(1) будет %0
float *U = &u; // в asm(2) будет %0
float *A = &a; // в asm(2) будет %0asm // решаем алгоритм r=sqrt(x*x+y*y); ( ".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров "movss xmm1, [%2] \n\t" //Заносим данные в регистр (х) "movss xmm2, [%2] \n\t" //Заносим данные в регистр (х) "mulss xmm1, xmm2 \n\t" //Умножаем х*х "movss xmm3, [%3] \n\t" //Заносим данные в регистр (y) "movss xmm2, [%3] \n\t" //Заносим данные в регистр (y) "mulss xmm2, xmm3 \n\t" //Умножаем y*y "addss xmm1, xmm2 \n\t" //Суммируем х*х и y*y "sqrtss xmm1, xmm1 \n\t" // ax,ax //Квадратный корень из (х*х+y*y) "movss [%0], xmm1 \n\t" //Вывод данных из регистра :"=r"(R) //возвращаемые данные(выходные операнды),нумеруются с нуля :"r"(R), "r"(X), "r"(Y) //Входные данные(продолжение нумерации) :"%xmm1", "%xmm2", "%xmm3" //Разрушение регистров ); //r=sqrt(x*x+y*y); if (r == 0) //условие, если r=0 - радиус, одна из компонентов полярной системы координат { U = 0; printf("R=%f\n", r); printf("U=%f\n", u); }; //U=asin(y/r); asm // решаем алгоритм asin(y/r);; ( ".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров "movss xmm1, [%3] \n\t" //Заносим данные в регистр (y) "movss xmm2, [%2] \n\t" //Заносим данные в регистр (R) = r из условия выше "divss xmm1, xmm2 \n\t" // Делим у на r "fsin \n\t" // cx, ax //Sin (y/r) "movss [%0],xmm1 \n\t" //cx //Вывод данных из регистра :"=r"(U) //возвращаемые данные(выходные операнды),нумеруются с нуля :"r"(U), "r"(R), "r"(Y) //Входные данные(продолжение нумерации) :"%xmm1", "%xmm2", "%xmm3" //Разрушение регистров ); if ((x < 0) && (y >= 0)) { asm // решаем алгоритм U=M_PI-U (доп. условия с учетом четвертей тригонометрии) ( ".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров "movss xmm1, [%2] \n\t" //Заносим данные в регистр (M_PI) - число pi "movss xmm2, [%1] \n\t" //Заносим данные в регистр (u) "subss xmm1, xmm2 \n\t" //Вычитаем U из M_PI "movss [%0], xmm1 \n\t" //Вывод данных из регистра :"=r"(U) //возвращаемые данные(выходные операнды),нумеруются с нуля :"r"(U), "r"(M_PI) //Входные данные(продолжение нумерации) :"%xmm1", "%xmm2" //Разрушение регистров ); } else if ((x < 0) && (y < 0)) { asm // решаем алгоритм U=(-1)*M_PI-U (доп. условия с учетом четвертей тригонометрии) ( ".intel_syntax noprefix \n\t" //синтаксис Intel, допускается опускание % перед именами регистров "movss xmm1, [%2] \n\t" //Заносим данные в регистр (M_PI) - число pi "movss xmm2, [%3] \n\t" //Заносим данные в регистр (a=-1) "mulss xmm1, xmm2 \n\t" //Умножаем a на M_PI "movss xmm2, [%1] \n\t" //Заносим данные в регистр (u) "subss xmm1, xmm2 \n\t" //Вычитаем из -M_PI U "movss [%0], xmm1 \n\t" //Вывод данных из регистра :"=r"(U) //возвращаемые данные(выходные операнды),нумеруются с нуля :"r"(U), "r"(M_PI), "r"(A) //Входные данные(продолжение нумерации) :"%xmm1", "%xmm2" //Разрушение регистров ); }; printf("R=%f\n", r); //вывод значений printf("U=%f\n", u); //вывод значений }
}
-
Before the team
fsin
I need to move the value from the register.xmm2
in glassFPU
♪