Помощь - Поиск - Пользователи - Календарь
Полная версия: ASSEMBLER > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
julia_lisha
спасите меня.....люди......
какой же не понятный этот ассемблер....
необходимо сделать вставку ассемлера в С++
дан пример: |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");
}

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

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

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

Кстати, не совсем понятно, что значит S(Ai + Bi)
julia_lisha
пишу в Microsoft Visual Studio 2005

S(Ai + Bi)-значит сумма от суммы массивов
Да, ответ отличается от си, асм показывает букву i....
Евгений М.
Цитата
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
Цитата
В результате получается:
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;
тогда все верно)
Евгений М.
Вот я исправил (точнее почистил) ассемблеровский код:
Код
__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
*YAHOO* Спасибо большое)
Евгений М.
Цитата(julia_lisha @ 4.2.2010, 18:15) *

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

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

Не за что.
julia_lisha
Код
//вычисление суммы массивов
         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

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

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


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

если sum<0
то
neg sum
и проиходит
sum*x
иначе
sum*x
конец если
julia_lisha
я все сделала)
функция модуля)
Код

         abso: neg sum
         JS abso

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.