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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2012, 18:59   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию Деление

Добрых суток.
Разбираюсь в асамблере, так сложилось что времени небыло что либо почитать, а лабу надо сдать. Вообщем скинули мне код (примерно как у меня задание) сложного в принципе ниче не увидел (там не чистый асм а вставка в плюсах) но есть одна проблема код выдает неверный результат, где именно идет ошибка нашел но почему она там появляется не могу понять.

Код:
int a,b,c,d,x,res_t,res_a;
	std::cout << "Please input A,B,C,D,X of a space: ";
	std::cin >>a>>b>>c>>d>>x;
	res_t = (a*x*x+b*x*x+c/x+d/x)/x; // проверка результата на плюсах
	_asm {
		 xor eax,eax 
		 xor ebx,ebx

                       // вот в этих 2 строчках программа ведет себя не так как я ожидаю
                       // все строчки приводить не стал  работают нормально
                       mov eax, c // аносим значение c в регистр eax
                       div x // деление, работаем с eax, резульата - частное в eax, остаток лежит в edx
                       mov res_a, eax // заносим результат в res_a почему то там мусор 

		 }
	std::cout << "Answer c++ : " << res_t <<"\n"; // результат, полученный при помощи c++
	std::cout << "Answer asm : " << res_a <<"\n"; // результат, полученный при помощи асмы
	_getch();
	return 0;
Всем спасибо за помощь
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 18.10.2012, 19:19   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

div с 32-битным операндом делит 64-битное число в edx:eax на операнд, поэтому надо сначала обнулить edx.
И раз число со знаком, тогда вообще надо заполнить edx знаком делимого и использовать idiv:
Код:
mov eax, c
cdq
idiv x
Кстати, осторожнее с xor ebx,ebx. Компилятор может хранить там одну из переменных и не ожидать, что ebx поменяется, так что надо бы его сохранить в стеке и восстановить потом.

Последний раз редактировалось Somebody; 18.10.2012 в 19:22.
Somebody вне форума Ответить с цитированием
Старый 18.10.2012, 19:43   #3
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Спасибо. Если не сложно то посмотрите в коменте я правильно понял работу команды
Код:
mov eax, c
cdq // заполняем ebx знаком делимого
idiv x
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление 0479 Общие вопросы по Java, Java SE, Kotlin 1 08.11.2010 00:37
Деление в C++ Bumbuk Помощь студентам 5 24.06.2010 02:06
Деление в С++ Tanilita Общие вопросы C/C++ 5 26.02.2010 17:28
Деление |{ot Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 24.03.2009 01:50
деление natasha Общие вопросы Delphi 6 22.01.2007 12:39