Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Образовательный студенческий форум _ Информатика / Программирование _ ASSEMBLER

Автор: julia_lisha 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");
}

заранее спасибо)

Автор: Евгений М. 4.2.2010, 11:52

Вопрос: Каким компилятором пользуютесь? У вас ошибка при компиляции или результат отличается от "сишного"?

Цитата(julia_lisha @ 4.2.2010, 16:22) *

дан пример: |S(Ai + Bi)| * X + X^2

Кстати, не совсем понятно, что значит S(Ai + Bi)

Автор: julia_lisha 4.2.2010, 11:57

пишу в Microsoft Visual Studio 2005

S(Ai + Bi)-значит сумма от суммы массивов
Да, ответ отличается от си, асм показывает букву i....

Автор: Евгений М. 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 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;
тогда все верно)

Автор: Евгений М. 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));
smile.gif

Так-же не забудь-те исправить
Код
"sum= sum+(a[pos]+ b[i]);"
на
Код
"sum= sum+(a[i]+ b[i]);"

Автор: julia_lisha 4.2.2010, 13:15

*YAHOO* Спасибо большое)

Автор: Евгений М. 4.2.2010, 13:19

Цитата(julia_lisha @ 4.2.2010, 18:15) *

*YAHOO* Спасибо большое)

"- Яху, спасибо большое".

Не за что.

Автор: julia_lisha 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

что ввыделенном фрагменте не обходимо заменить чтобы получилось по модулю?.....

Автор: Евгений М. 6.2.2010, 5:15

Хочу сказать, что "сумма массивов" в нашем коде выполняется без проблем т.е. так, как нам нужно. Поэтому зачем ее трогать? sad.gif Удобнее реализовать отдельную процедуру для вычисления абсолютного значения.

Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG).

Автор: julia_lisha 6.2.2010, 13:31

Цитата
Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG).


да да, логично я понимая средствами ассм не знаю как сделать

если sum<0
то
neg sum
и проиходит
sum*x
иначе
sum*x
конец если

Автор: julia_lisha 6.2.2010, 15:03

я все сделала)
функция модуля)

Код

         abso: neg sum
         JS abso


Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)