помогите написать ассемблерную вставку правильно в цикле? язык Си
Пытался написать вставку но она не заработала. В комментарии указано то, что по идее должна делать вставка.
#include<stdio.h>
#include<math.h>
#include<locale.h>
#include<malloc.h>
#include<stdlib.h>
int main()
{
setlocale (0, "");
double x, mo, s;
int n, i;
double *X = &x;
double *MO = &mo;
double *S = &s;
int *N = &n;
int *I = &i;
printf("Vvedite kolichestvo chisel v massive \n");
printf("n:");
if (scanf("%d", &n))
{
double a[n];
double *A = &a[i];
mo=0;
printf("Vvedite znacheniya elementov \n");
for (i = 0; i<n; i++)
{
printf("a[%d] = ", i);
if (!(scanf("%lf", &a[i])))
{
printf("Error. Vvedeni nepravelnie dannie\n");
break;
}
else
{
//mo=mo+a[i];
asm
(
".intel_syntax noprefix \n\t"
"mov ax, [%1] \n\t"
"mov bx, [%2] \n\t"
"add ax, bx \n\t"
"mov [%0], ax \n\t"
: "=r"(MO)
: "r"(MO), "r"(A[I])
: "%ax", "%bx"
);
if (i==(n-1))
{
printf("Mat ogidanie: %lf\n", mo);
s=mo/n;
printf("Srednekvadratichnoe otklonenie: %lf\n", s);
}
}
}
}
else printf("Error. Vvedeni nepravelnie dannie\n");
return 0;
}
Ответы (1 шт):
Автор решения: AnyKeyShik
→ Ссылка
В вашем случае есть два варианта
Первый
Вместо double использовать float и спокойно использовать набор команд сопроцессора x87:
__asm__(
"FLDS %1 \n" // mo
"FADDS %2 \n" // mo + a[i]
"FSTPS %0 \n" // mo
: "=m"(mo)
: "m"(mo), "m"(a[i])
: );
Второй
Использовать набор инструкций SSE, что ощутимо больнее. Делать это через асм-вставку крайне не рекомендую, можно просто через си.