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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2011, 15:07   #1
begovik
Пользователь
 
Аватар для begovik
 
Регистрация: 08.03.2010
Сообщений: 48
По умолчанию деление на слово

Здравствуйте! У меня появилась проблема относительно деления на слово
(регистры 16-bit). Вот, что я прочитал:

если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

То-есть, если я делю F4240h на 0Ah - получается 186A0h и остаток 0,
то выходит ошибка деления.
можно ли перенаправить либо входные данные либо результат
в другие регистры, и вобще возможно тут что-то зделать?
begovik вне форума Ответить с цитированием
Старый 17.05.2011, 16:31   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

begovik, дели сначала старшую часть, потом младшую.
Код:
mov ax,0fh
mov bx,0ah
xor dx,dx
div bx
push ax
mov ax,4240h
div bx
pop dx
dx:ax - результат.
vadimych вне форума Ответить с цитированием
Старый 18.05.2011, 05:01   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

begovik
Пишем программу для беззнакового деления переменной, размером в 3 байта (0F4240h), на переменную, размером в байт (0Ah). Представим делимое как (a*10000h+b*100h+c), а делитель как d
первое деление a на d даст частное r1 и остаток q1
второе деление (q1*100h+b) на d – частное r2 и остаток q2;
третье деление (q2*100h+c) на d – частное r3 и остаток q3;
результатом будет частное (r1*10000h+r2*100h+r3) и остаток q3

А теперь, следуя этой методе, делим 0F4240h на 0Ah и смотрим остатки
1) 0F4240h / 0Ah = 186A0h остаток 0 186h > 0Ah
2) 186A0h / 0Ah = 2710h остаток 0 27h > 0Ah
3) 2710h / 0Ah = 3E8h остаток 0 3 < 0Ah отсюда можно воспользоваться обычным делением
4) 3E8h / 0Ah = 64h остаток 0
5) 64h / 0Ah = 0Ah остаток 0
6) Ah / 0Ah = 1 остаток 0
7) 1 / 0Ah = 0 остаток 1
собираем остатки и получаем число 1000000, проверяем на калькуляторе 1000000=0F4240h
Mikl___ вне форума Ответить с цитированием
Старый 22.05.2011, 13:12   #4
begovik
Пользователь
 
Аватар для begovik
 
Регистрация: 08.03.2010
Сообщений: 48
По умолчанию

Спасибо, vadimych! Спасибо, Mikl___!
Программа выводит на экран все кратные двух чисел,
начиная от произведения одного на другое.
Правда работает ещё кривовато...
Вложения
Тип файла: zip nok.zip (2.2 Кб, 6 просмотров)
begovik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление Nikita++ Помощь студентам 8 19.03.2011 18:56
Деление 0479 Общие вопросы по Java, Java SE, Kotlin 1 08.11.2010 00:37
Деление в C++ Bumbuk Помощь студентам 5 24.06.2010 02:06
Деление |{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