Самую (желательно) быструю процедуру,кто подскажет?
Самую (желательно) быструю процедуру,кто подскажет?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Обговори условия (разрядность, набор используемых регистров, константность операндов, нужные компоненты результата- частное/остаток, и т.д.)
Какое деление/умножение, знаковое, без? Последовательное или одновременное?
Некоторые алгоритмы есть тут - http://www.piter.com/lib/97857190003...il=wgasm09#n01. Насчет оптимальности не знаю, но меня убила процедура SQR размером 28 байт.
2:vitoz80/svs/rgb Кое-что есть в недрах ПЗУ, в "Как написать игру на ассемблере для ZX..." (см. раздел литературы этого сайта) есть, как помнится, знаковые умножение и деление, беззнаковый корень, аргументы берут в регистровых парах HL, DE, рез-т в HL. Судя по не сильной понятности, но небольшому размеру - не самые плохие, но вряд ли САМЫЕ быстрые; так как тамошнее умножение берет 2 любых -32786 .. 32767 - это довольно универсальные процедуры. А самые быстрые обычно не универсальны, это 16 бит * на 8, или один аргумент - всего несколько вариантов, там например 10,100,1000. Поэтому уточни условия работы процедуры, какие-нибудь особенности (если есть), которые позволяют упрощать и убыстрять расчеты.
Ооп... извиняюсь, процедуры из вышеупомянутой книги -- это как раз те, которые указал Shwartz.
Offtop: O_O издательство "Питер" дает бесплатно читать некоторые книги?????
Последний раз редактировалось TomCaT; 28.09.2008 в 00:08. Причина: невнимательное чтение пред. постов, повтор инфы
Помни. Только на компьютере можно семь раз Cut, а один - Format. В реале все иначе. (c)
Власть людей сильнее, чем люди у власти.
Чем меньше мы смотрим на мир, тем больше задумываемся о нем. (c)
Скрытый текст
Can you help Robin in his quest for the silver arrow? (c) Odin "Robin of the Wood"
Мы все немного режем по дереву, а потом собираем корабли в бутылках.
Is it the same old story you are going to tell me
or is it the old story telling me and you we are the same?
http://www.sky.od.ua/~ptsk[свернуть]
Искал алгоритм поразрядного деления, и случайно наткнулся на этот шедевр:
Может кто-то обьяснит, куда девалась проверка флага переноса после rla? Или я просто много хочу на ночь глядя? В процедуре деления, где делимое равно или меньше делителя, эта проверка не нужна, т.к. разрядность рабочего регистра остатка больше или равна числу сдвигов. В случае же, когда разрядность делителя меньше делимого, эта проверка требуется, иначе деление на число >= $80 приведет к глюку.Код:2.4 Classic 24-bit / 8-bit Unsigned Input: HLD = Dividend, E = Divisor, A = 0 Output: HLD = Result, A = Remainder slia d ; unroll 24 times add hl,hl ; ... rla ; ... sub e ; ... jr nc,$+3 ; ... add a,e ; ... dec d ; ...
В самом деле, возможен глюк при делении на число >$80 (не всегда). Значит ошибка в алгоритме. Надо же! А ведь я столько времени пользовался похожим алгоритмом, который тоже не проверяет перенос после сдвига рабочего регистра остатка.
Когда делитель >$80, а в рабочем регистре остатка хранится число >=$80, но меньше делителя, то пробное вычитание окажется неуспешным, а на следующем проходе цикла рабочий регистр остатка будет сдвинут влево, т.е. там образуется число >=$100. Однако 8-разрядный аккумулятор не может хранить такое число, и старший разряд попадет во флаг C.
В такой ситуации пробное вычитание должно обязательно быть успешным, т.к. $100>$FF (максимальное значение делителя). Однако поскольку старший разряд, находящийся во флаге C, данным алгоритмом не учитывается, то пробное вычитание снова окажется неуспешным. В результате в частное и в рабочий регистр остатка попадет неверная информация, делающая дальнейшую работу алгоритма ошибочной.
Еще одна ошибка приведенного алгоритма - это то, что нужно применять ADC HL,HL, а не ADD HL,HL.
---
Вот вариация без недокументированных команд и чуть быстрее (на одну команду в цикле):
Код:2.4 Classic 24-bit / 8-bit Unsigned Input: HLD = Dividend, A = Divisor Output: HLD = Result, A = Remainder neg ld e,a xor a rl d ; unroll 24 times adс hl,hl ; ... rla ; ... add a,e ; ... jr c,$+3 ; ... sub e ; ...
Последний раз редактировалось Barmaley_m; 27.11.2009 в 00:06. Причина: исправил тег
Совершенно верно. Что самое интересное, в приведенном документе все алгоритмы деления, у которых разрядность делителя меньше делимого, будет данный глюк. Возможно, автор взял за основу самый первый алгоритм, где делитель равнялся делимому, и на основе него настругал более разрядные, но не подумал, что может быть переполнение регистра остатка.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)