Важная информация

User Tag List

Страница 1 из 5 12345 ПоследняяПоследняя
Показано с 1 по 10 из 52

Тема: Деление/умножение

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Member Аватар для Serdjuk
    Регистрация
    07.09.2008
    Адрес
    г. Новокузнецк, Кемеровская обл.
    Сообщений
    61
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    20
    Поблагодарили
    6 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Question Деление/умножение

    Самую (желательно) быструю процедуру,кто подскажет?

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,259
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    85
    Поблагодарили
    36 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Обговори условия (разрядность, набор используемых регистров, константность операндов, нужные компоненты результата- частное/остаток, и т.д.)

  4. #3
    Member Аватар для Serdjuk
    Регистрация
    07.09.2008
    Адрес
    г. Новокузнецк, Кемеровская обл.
    Сообщений
    61
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    20
    Поблагодарили
    6 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    разрядность, набор используемых регистров, константность операндов, нужные компоненты результата- частное/остаток, и т.д.)
    о.. ё...
    учился я плохо.....
    результат:
    целое в первом байте,остаток во втором...

  5. #4
    Member Аватар для Shwartz
    Регистрация
    31.08.2007
    Адрес
    Kharkov
    Сообщений
    37
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Какое деление/умножение, знаковое, без? Последовательное или одновременное?

    Некоторые алгоритмы есть тут - http://www.piter.com/lib/97857190003...il=wgasm09#n01. Насчет оптимальности не знаю, но меня убила процедура SQR размером 28 байт.

  6. #5
    Member Аватар для Serdjuk
    Регистрация
    07.09.2008
    Адрес
    г. Новокузнецк, Кемеровская обл.
    Сообщений
    61
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    20
    Поблагодарили
    6 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Shwartz Посмотреть сообщение
    Некоторые алгоритмы есть тут - http://www.piter.com/lib/97857190003...il=wgasm09#n01.
    ок посмотрим....

  7. #6
    Veteran Аватар для TomCaT
    Регистрация
    25.06.2005
    Адрес
    Одесса
    Сообщений
    1,795
    Спасибо Благодарностей отдано 
    54
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    22 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    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
    [свернуть]


  8. #7

  9. #8
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,662
    Спасибо Благодарностей отдано 
    1,254
    Спасибо Благодарностей получено 
    1,882
    Поблагодарили
    711 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Искал алгоритм поразрядного деления, и случайно наткнулся на этот шедевр:

    Код:
    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		; ...
    Может кто-то обьяснит, куда девалась проверка флага переноса после rla? Или я просто много хочу на ночь глядя? В процедуре деления, где делимое равно или меньше делителя, эта проверка не нужна, т.к. разрядность рабочего регистра остатка больше или равна числу сдвигов. В случае же, когда разрядность делителя меньше делимого, эта проверка требуется, иначе деление на число >= $80 приведет к глюку.

  10. #9
    Veteran
    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,058
    Спасибо Благодарностей отдано 
    224
    Спасибо Благодарностей получено 
    47
    Поблагодарили
    31 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Код:
    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		; ...
    Может кто-то обьяснит, куда девалась проверка флага переноса после rla? Или я просто много хочу на ночь глядя? В процедуре деления, где делимое равно или меньше делителя, эта проверка не нужна, т.к. разрядность рабочего регистра остатка больше или равна числу сдвигов. В случае же, когда разрядность делителя меньше делимого, эта проверка требуется, иначе деление на число >= $80 приведет к глюку.
    В самом деле, возможен глюк при делении на число >$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. Причина: исправил тег

  11. #10
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,662
    Спасибо Благодарностей отдано 
    1,254
    Спасибо Благодарностей получено 
    1,882
    Поблагодарили
    711 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    В самом деле, возможен глюк при делении на число >$80 (не всегда). Значит ошибка в алгоритме. Надо же! А ведь я столько времени пользовался похожим алгоритмом, который тоже не проверяет перенос после сдвига рабочего регистра остатка.

    Когда делитель >$80, а в рабочем регистре остатка хранится число >=$80, но меньше делителя, то пробное вычитание окажется неуспешным, а на следующем проходе цикла рабочий регистр остатка будет сдвинут влево, т.е. там образуется число >=$100. Однако 8-разрядный аккумулятор не может хранить такое число, и старший разряд попадет во флаг C.

    В такой ситуации пробное вычитание должно обязательно быть успешным, т.к. $100>$FF (максимальное значение делителя). Однако поскольку старший разряд, находящийся во флаге C, данным алгоритмом не учитывается, то пробное вычитание снова окажется неуспешным. В результате в частное и в рабочий регистр остатка попадет неверная информация, делающая дальнейшую работу алгоритма ошибочной.
    Совершенно верно. Что самое интересное, в приведенном документе все алгоритмы деления, у которых разрядность делителя меньше делимого, будет данный глюк. Возможно, автор взял за основу самый первый алгоритм, где делитель равнялся делимому, и на основе него настругал более разрядные, но не подумал, что может быть переполнение регистра остатка.

Страница 1 из 5 12345 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Быстрое умножение на 10000
    от litwr в разделе БК-0010/0011
    Ответов: 53
    Последнее: 11.12.2021, 03:54
  2. Ответов: 8
    Последнее: 19.10.2017, 15:08
  3. Процедуры на асме (умножение деления)
    от gres8 в разделе Программирование
    Ответов: 3
    Последнее: 25.01.2007, 10:26
  4. деление синхросигнала
    от Splinter в разделе Изображение
    Ответов: 3
    Последнее: 01.08.2005, 02:53

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •