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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2012, 23:33   #1
stupidstudent
 
Аватар для stupidstudent
 
Регистрация: 09.09.2011
Сообщений: 7
Восклицание [MASM611] простой пример ...

Добрый вечер!
такой вот примерчик: a/(b+a)-(2*a*b)/c
числа а = 2, б = 2, с = 4
Все работает, считает правильно как a/(b+a) так и (2*a*b)/c, вычитание работает.
Ответ в итоге 1FA (-16), а должен быть -1.5 в соотвествии с этими числами.
Начал изучать ассемблер недавно, сильно не пинайте.
Ошибку найти не могу...
Еще вопрос, для хранения результата, например a/(b+a), можно использовать как регистры (AX, BX, CX, DX ), так и в любой переменной которую задал сам? Так что лучше\правильней?

Код:
data segment

A db 2
B db 2
j db 4; j=с

dva db 2
mem db ?
mem2 db ?

data  ends

sst segment stack 
db 255 dup (?)

sst ends

code segment
assume ds:data, cs:code, ss:sst

metka:
mov ax, data
mov ds, ax
;---------------------------------
mov ah, A ; перемещаем 2ку в старший разряд AH 
add ah, B ; складываем 2ку и 2ку и результат в AH
mov mem, ah ; перемещаем результат сложения в mem

mov al, a ; перемещаем А в al дабы избежать путаницы
cbw ; --\\--
idiv mem ; делим 8 на сумму 10 в mem 

mov bx, ax ; перемещаем ах в bx

mov al, dva ; умножение 2 умножить
mul a ; на 2
mul b ; на 2
cbw
idiv j ; и разделить на 4 (8\4) = 2
sub bx, ax ; вычитание bx и ax



;---------------------------------
mov ax, 4C00h
int 21h
code ends
end metka
stupidstudent вне форума Ответить с цитированием
Старый 06.02.2012, 10:34   #2
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

хм, по моим подсчетам должно было получиться 1FEh...
объясняю почему:
первый idiv mem делит 2 на 4, итого целая часть 0 остаток 2, запишется это в ax в виде 0200h. целая часть - в al, остаток - в ah.
аналогично второй idiv делит 8 на 4, в ax будет 2. Итого 200h-2=1FEh
не знаю как оптимальнее, но можно привести все к одному знаменателю и сначала вычесть, а потом делить. Т.е. считать по формуле a*c-2*a*b*(b+a)/(c*(b+a))
alexey2 вне форума Ответить с цитированием
Старый 06.02.2012, 19:50   #3
stupidstudent
 
Аватар для stupidstudent
 
Регистрация: 09.09.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от alexey2 Посмотреть сообщение
должно было получиться 1FEh...
у меня был и такой вариант, но вроде не правильный, т.к. если перевести в 10 ричную то получится -3(если не ошибаюсь)
ошибка заключалась в
Код:
mov bx, ax
там я перемещаю в ВХ всю АХ, а нужно токлько частное АL
stupidstudent вне форума Ответить с цитированием
Старый 06.02.2012, 21:21   #4
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

я не понял - разобрался ты или нет, но целые части можно вычитать, а остатки - нет, т.к. они от разных делителей. И делать это лучше с байтовыми регистрами отдельно друг от друга.
Да, а как ты собираешься представить дробный результат в 16ричном виде?
alexey2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не запускается простой пример SkrudjMakdak Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 0 29.12.2011 12:44
Простой пример AJAX cargo29 JavaScript, Ajax 12 26.09.2011 16:40
Самый простой пример J-Max C++ Builder 1 03.12.2010 22:59
Простой пример базы данных? Iceman БД в Delphi 2 28.06.2010 06:32
Простой пример СOM технологий Красавчег))) Общие вопросы Delphi 0 02.06.2010 00:28