julia_lisha
Сообщение
#52314 4.2.2010, 11:22
спасите меня.....люди......
какой же не понятный этот ассемблер....
необходимо сделать вставку ассемлера в С++
дан пример: |S(Ai + Bi)| * X + X^2
на с++ все верно а на ассемблере где то ошибка....кто понимает помогите мне
#include "stdafx.h"
#include "iostream"
#include "windows.h"
int a[3];
int b[3];
int my_c(int x)
{
int pos,i;
pos=0;
int sum=0;
for(i=0;i<3;i++)
{
pos=0;
{
sum= sum+(a[pos]+ b[i]);
pos++;
}
}
sum=sum*x;
int pow=0;
pow=x*x;
sum= sum+pow;
return sum;
}
int my_assembler(int x)
{
int sum=0, pos=0, pow=0, elem_b=0;
__asm
{
MOV eax,0
MOV ebx,0
MOV ecx,3
MOV esi,0
//вычисление суммы массивов
cycle_i:
PUSH ecx
MOV ecx,3
MOV pos,0
MOV esi,pos
MOV eax,a[esi]
ADD esi,4
MOV pos,esi
MOV esi,elem_b
MOV edx,b[esi]
ADD esi,4
MOV elem_b,esi
//сумма массивов
ADD eax,edx
ADD eax,sum
MOV sum,eax
SUB esi,4
MOV elem_b,esi
POP ecx
LOOP cycle_i
//умножаем sum на x
MOV eax,0
MOV ebx,0
MOV ecx,0
MOV eax,sum
MOV ecx,x
IMUL ecx
MOV sum,eax
//вычисляем квадрат x
MOV edx,x
MOV ecx,x
iMUL cx
//складываем с суммой квадрат x
MOV eax,sum
ADD eax,ecx
MOV sum,eax
}
return sum;
}
void main()
{
int i;
system("title Вычисление значения выражения");
printf("\tWasil'eva Julia CB-901 ZY\n");
printf("|S(Ai + Bi)| * X + X^2 \n");
for(int i=0; i<3; i++)
{
printf("Vvedite element A: ");
scanf("%d",&a[i]);
}
for(int i=0; i<3; i++)
{
printf("Vvedite element B: ");
scanf("%d",&b[i]);
}
int x=0;
printf("Vvedite chislo X: ");
scanf("%d",&x);
printf("C++=%i\n",my_c(x));
printf("Otvet=i\n",my_assembler(x));
system("pause");
}
заранее спасибо)
Евгений М.
Сообщение
#52315 4.2.2010, 11:52
Вопрос: Каким компилятором пользуютесь? У вас ошибка при компиляции или результат отличается от "сишного"?
Цитата(julia_lisha @ 4.2.2010, 16:22)

дан пример: |S(Ai + Bi)| * X + X^2
Кстати, не совсем понятно, что значит S(Ai + Bi)
julia_lisha
Сообщение
#52316 4.2.2010, 11:57
пишу в Microsoft Visual Studio 2005
S(Ai + Bi)-значит сумма от суммы массивов
Да, ответ отличается от си, асм показывает букву i....
Евгений М.
Сообщение
#52317 4.2.2010, 12:12
Цитата
for(i=0;i<3;i++)
{
pos=0;
{
sum= sum+(a[pos]+ b[i]);
pos++;
}
}
В результате получается:
sum= sum+(a[0]+ b[0]);
sum= sum+(a[0]+ b[1]);
sum= sum+(a[0]+ b[2]);
Вы ничего не забыли в или рядом с выделеным фрагментом кода?
julia_lisha
Сообщение
#52319 4.2.2010, 12:23
Цитата
В результате получается:
sum= sum+(a[0]+ b[0]);
sum= sum+(a[0]+ b[1]);
sum= sum+(a[0]+ b[2]);
по идеи должно быть так:
sum= sum+(a[0]+ b[0]);
sum= sum+(a[1]+ b[1]);
sum= sum+(a[2]+ b[2]);
Цитата
for(i=0;i<3;i++)
{
pos=0;
{
sum= sum+(a[pos]+ b[i]);
pos++;
}
}
ошибка там(((
pos=i;
тогда все верно)
Евгений М.
Сообщение
#52320 4.2.2010, 13:06
Вот я исправил (точнее почистил) ассемблеровский код:
Код
__asm
{
MOV esi,0
MOV ecx,0
//вычисление суммы массивов
cycle_i:
MOV eax,a[esi]
MOV edx,b[esi]
ADD esi,4
//сумма массивов
ADD sum, eax
ADD sum, edx
INC ecx
CMP ecx, 3
JL cycle_i
//умножаем sum на x
MOV eax,sum
MOV ecx,x
IMUL ecx
MOV sum,eax
//вычисляем квадрат x
MOV eax,x
MOV ecx,x
iMUL cx
//складываем с суммой квадрат x
ADD sum,eax
}
Цитата
асм показывает букву i
Посмотрите внимательно на...
Код
printf("Otvet=i\n",my_assembler(x));
Так-же не забудь-те исправить
Код
"sum= sum+(a[pos]+ b[i]);"
на
Код
"sum= sum+(a[i]+ b[i]);"
Евгений М.
Сообщение
#52323 4.2.2010, 13:19
Цитата(julia_lisha @ 4.2.2010, 18:15)

*YAHOO* Спасибо большое)
"- Яху, спасибо большое".
Не за что.
julia_lisha
Сообщение
#52373 5.2.2010, 19:48
Код
//вычисление суммы массивов
cycle_i:
MOV eax,a[esi]
MOV edx,b[esi]
ADD esi,4
//сумма массивов
ADD sum, eax
ADD sum, edx
INC ecx
CMP ecx, 3
[b] JL 1
NEG eax[/b]
JB cycle_i
что ввыделенном фрагменте не обходимо заменить чтобы получилось по модулю?.....
Евгений М.
Сообщение
#52375 6.2.2010, 5:15
Хочу сказать, что "сумма массивов" в нашем коде выполняется без проблем т.е. так, как нам нужно. Поэтому зачем ее трогать?

Удобнее реализовать отдельную процедуру для вычисления абсолютного значения.
Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG).
julia_lisha
Сообщение
#52386 6.2.2010, 13:31
Цитата
Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG).
да да, логично я понимая средствами ассм не знаю как сделать
если sum<0
то
neg sum
и проиходит
sum*x
иначе
sum*x
конец если