IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> ASSEMBLER
julia_lisha
сообщение 4.2.2010, 11:22
Сообщение #1


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



спасите меня.....люди......
какой же не понятный этот ассемблер....
необходимо сделать вставку ассемлера в С++
дан пример: |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
Сообщение #2


Студент
**

Группа: Продвинутые
Сообщений: 199
Регистрация: 6.11.2009
Город: Уфа
Вы: студент



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

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

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

Кстати, не совсем понятно, что значит S(Ai + Bi)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
julia_lisha
сообщение 4.2.2010, 11:57
Сообщение #3


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



пишу в Microsoft Visual Studio 2005

S(Ai + Bi)-значит сумма от суммы массивов
Да, ответ отличается от си, асм показывает букву i....
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Евгений М.
сообщение 4.2.2010, 12:12
Сообщение #4


Студент
**

Группа: Продвинутые
Сообщений: 199
Регистрация: 6.11.2009
Город: Уфа
Вы: студент



Цитата
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
Сообщение #5


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



Цитата
В результате получается:
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
Сообщение #6


Студент
**

Группа: Продвинутые
Сообщений: 199
Регистрация: 6.11.2009
Город: Уфа
Вы: студент



Вот я исправил (точнее почистил) ассемблеровский код:
Код
__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));
(IMG:style_emoticons/default/smile.gif)

Так-же не забудь-те исправить
Код
"sum= sum+(a[pos]+ b[i]);"
на
Код
"sum= sum+(a[i]+ b[i]);"
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
julia_lisha
сообщение 4.2.2010, 13:15
Сообщение #7


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



*YAHOO* Спасибо большое)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Евгений М.
сообщение 4.2.2010, 13:19
Сообщение #8


Студент
**

Группа: Продвинутые
Сообщений: 199
Регистрация: 6.11.2009
Город: Уфа
Вы: студент



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

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

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

Не за что.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
julia_lisha
сообщение 5.2.2010, 19:48
Сообщение #9


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



Код
//вычисление суммы массивов
         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
Сообщение #10


Студент
**

Группа: Продвинутые
Сообщений: 199
Регистрация: 6.11.2009
Город: Уфа
Вы: студент



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

Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
julia_lisha
сообщение 6.2.2010, 13:31
Сообщение #11


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



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


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

если sum<0
то
neg sum
и проиходит
sum*x
иначе
sum*x
конец если
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
julia_lisha
сообщение 6.2.2010, 15:03
Сообщение #12


Студент
**

Группа: Продвинутые
Сообщений: 147
Регистрация: 19.12.2009
Из: Omsk
Город: omsk
Учебное заведение: ОмГУ



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

         abso: neg sum
         JS abso

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 18.4.2024, 2:14

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru