Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2011, 12:08   #1
DoubleM
Новичок
Джуниор
 
Регистрация: 16.03.2011
Сообщений: 2
Восклицание Проблемы с Assembler

Собственно говоря вот код программы:

Код:
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>

using namespace std;

void main()
 {
SetConsoleCP(1251); //подключение рус.языка 
SetConsoleOutputCP(1251);
long int a,b,c,right,left,right_a,left_a;
int err; // признак переполнения
for(;;)
 {
printf("\nПроверка тождества (a-b+c)2 = a2+b2+c2-2ab+2ac-2bc ");
printf("\nгде a=a/(13+2); b=b/(13+3); c=c/(13+4)");
printf("\n\nВведите a: ");
scanf_s("%li",&a);
printf("Введите b: ");
scanf_s("%li",&b);
printf("Введите c: ");
scanf_s("%li",&c);
//Разделить исходные переменные
 a=a/(13+2); b=b/(13+3); c=c/(13+4);
  //----------------Вычисление на С-------------------
  //вычисление левой части тождества
left = (a-b+c)*(a-b+c);
  //вычисление правой части тождества
right = a*a+b*b+c*c-2*b*a+2*a*c-2*b*c;
//-------------Вычисление на ассемблере-------------
__asm{
		mov err,0  //сброс флага ошибок
		//вычисляем левую часть тождества
mov eax,a
sub eax,b
jo OF
add eax,c
jo OF
imul eax,eax
jo OF
mov left_a,eax
//вычисляем правую часть тождества
mov eax,a
imul eax,eax
jo OF
mov ebx,b
imul ebx,ebx
jo OF
add eax,ebx
jo OF
mov ebx,c
imul ebx,ebx
jo OF
add eax,ebx
jo OF
mov ebx,a
imul ebx,b
jo OF
imul ebx,2
jo OF
sub eax,ebx
jo OF
mov ebx,a
imul ebx,c
jo OF
imul ebx,2
jo OF
add eax,ebx
jo OF
mov ebx,b
imul ebx,c
jo OF
imul ebx,2
jo OF
mov right_a,ebx
jmp END
OF: mov err,1
END: mov right_a,eax
  }
//Вывод результатов
printf("\n\nЛевая часть тождества на С: %li",left);
printf("\nПравая часть тождества на С: %li",right);
if(err) printf("\nВозникновение переполнения при вычислении на ассемблере");

printf("\nЛевая часть тождества на ассемблере: %li",left_a);
printf("\nПравая часть тождества на ассемблере: %li\n",right_a);
getch();
 }
}

Всё работает, но подсчет правой части на Assembler'e производится неверно. Подскажите в чем ошибка.

Последний раз редактировалось DoubleM; 16.03.2011 в 12:13.
DoubleM вне форума Ответить с цитированием
Старый 16.03.2011, 12:34   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Последнее вычитание не сделано.
Код:
mov ebx,b
imul ebx,c
jo OF
imul ebx,2
jo OF
sub eax,ebx
jmp END
OF: mov err,1
END: mov right_a,eax
vadimych вне форума Ответить с цитированием
Старый 16.03.2011, 12:49   #3
DoubleM
Новичок
Джуниор
 
Регистрация: 16.03.2011
Сообщений: 2
По умолчанию

О пасибо!! Всё работает
DoubleM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler. Lera Фриланс 2 15.12.2010 16:13
Assembler banano Фриланс 1 17.05.2010 15:44
Assembler Натся Помощь студентам 1 22.12.2009 20:04