![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
julia_lisha |
![]()
Сообщение
#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"); } заранее спасибо) |
![]() ![]() |
Евгений М. |
![]()
Сообщение
#2
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 199 Регистрация: 6.11.2009 Город: Уфа Вы: студент ![]() |
|
julia_lisha |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 147 Регистрация: 19.12.2009 Из: Omsk Город: omsk Учебное заведение: ОмГУ ![]() |
пишу в Microsoft Visual Studio 2005
S(Ai + Bi)-значит сумма от суммы массивов Да, ответ отличается от си, асм показывает букву i.... |
Евгений М. |
![]()
Сообщение
#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 |
![]()
Сообщение
#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; тогда все верно) |
Евгений М. |
![]()
Сообщение
#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 |
![]()
Сообщение
#7
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 147 Регистрация: 19.12.2009 Из: Omsk Город: omsk Учебное заведение: ОмГУ ![]() |
*YAHOO* Спасибо большое)
|
Евгений М. |
![]()
Сообщение
#8
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 199 Регистрация: 6.11.2009 Город: Уфа Вы: студент ![]() |
|
julia_lisha |
![]()
Сообщение
#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 что ввыделенном фрагменте не обходимо заменить чтобы получилось по модулю?..... |
Евгений М. |
![]()
Сообщение
#10
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 199 Регистрация: 6.11.2009 Город: Уфа Вы: студент ![]() |
Хочу сказать, что "сумма массивов" в нашем коде выполняется без проблем т.е. так, как нам нужно. Поэтому зачем ее трогать? (IMG:style_emoticons/default/sad.gif) Удобнее реализовать отдельную процедуру для вычисления абсолютного значения.
Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG). |
julia_lisha |
![]()
Сообщение
#11
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 147 Регистрация: 19.12.2009 Из: Omsk Город: omsk Учебное заведение: ОмГУ ![]() |
Цитата Алгоритм вычисления абсолютного значения довольно прост: если число меньше нуля, тогда инвертировать число (т.е. применить операцию NEG). да да, логично я понимая средствами ассм не знаю как сделать если sum<0 то neg sum и проиходит sum*x иначе sum*x конец если |
julia_lisha |
![]()
Сообщение
#12
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 147 Регистрация: 19.12.2009 Из: Omsk Город: omsk Учебное заведение: ОмГУ ![]() |
я все сделала)
функция модуля) Код abso: neg sum JS abso |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 14:02 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru