1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

алгоритм idiv

Тема в разделе "WASM.A&O", создана пользователем Mikl___, 23 ноя 2021 в 20:12.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.200
    Потребовалось в двоичной системе разделить +117/-13. Если бы делилось 117 на 13, то тут всё просто, использовались бы вычитания и сдвиги
    02.jpg
    а вот как разделить 01110101 на 11110011 чтобы в результате получилось 11110111 при этом используя элементарные операции (сдвиги, сложение. вычитание)?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.115
    Делить абсолютные значения и результату поменять знак соответственно (sign1 xor sign2).
     
    Mikl___ нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.200
    rmn,
    это первое, что приходит в голову, но как-то "некузяво". Я понимаю, что нужно искать литературу по intel8080 или микроконтроллерам и смотреть там, но пока ничего под руками нет
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.602
    Mikl___,

    p.184

    Довольно тяжело воспринимается(два регистровых набора) впрочем это матан иначе не может быть. Мантиссы и тп твоя тема.
     

    Вложения:

    Последнее редактирование: 23 ноя 2021 в 23:19
    Mikl___ нравится это.
  5. aa_dav

    aa_dav Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    213
    Никогда не видел чтобы деление обобщали на знаковые числа без анализа знаков делимого и делителей с переводом в беззнаковые и коррекцией результата. Собственно это то же самое, что мы делаем в столбик.

    Да это ж оверкилл с вещественными числами.
    Если уж нужен кусок кода на Z80 (с беззнаковыми!), то вот:
    Код (Text):
    1.  
    2. ; H_div_L - деление h / l
    3. ; in:   h - делимое
    4. ;       l - делитель
    5. ; out:  h <- h / l (результат)
    6. ;       a <- h % l (остаток)
    7. H_div_L         push bc
    8.                 ld b, 8
    9.                 xor a
    10. .loop           sla h
    11.                 rla
    12.                 cp l
    13.                 jr c, .skip
    14.                 inc h
    15.                 sub l
    16. .skip           djnz .loop
    17.                 pop bc
    18.                 ret
    19.  
    Это всё то же самое деление в столбик, но с небольшими оптимизациями - результат сразу же замещает делимое в регистре h по ходу процесса.
    Но при делении на константы возможны дополнительные трюки.
    На x86 стал излюбленным трюк когда переводят в вещественные, умножают на константу и одним сдвигом выбивают возможную ошибку из нижних разрядов.
     
    Mikl___ нравится это.
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.200
  7. algent

    algent Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    32
    Практического смысла гораздо больше в варианте rmn, но ради "кузявости":
    Ваше 117/13 = 117 - 13 * 8 - 13 * 1
    отнять положительное, это тоже самое, что прибавить отрицательное:
    117/(-13) = 117 + (-13 * 8) + (-13 * 1) = 117 + (11110011b * 8) + (11110011b * 1) = 01110101b + 10011ooob + 11110011b
    Чтоб совсем просто: деление столбиком - это один интеллектуальный шажочек от совсем тупого варианта: Отняли делитель,
    инкрементировали счётчик(он же, будущее частное) и так в цикле, пока >= 0.
    Просто отнимают не делитель * 1, А делитель * 2, или/и делитель * 4, или/и делитель * 8, и т. д. И соотв-но, +2 к результату, или +4 или +8 ....
     
    Mikl___ нравится это.