15 Декабря 2004, 13:20 | Оценка: нет оценки
КОД
mpy clrf byte0 //очищаем регистры отведенные под резултьтат, первый
clrf byte1 //очищаем регистры отведенные под резултьтат, второй
clrf byte2 //очищаем регистры отведенные под резултьтат, третий
clrf byte3 //очищаем регистры отведенные под резултьтат, четвертый (результат 32 разряда)
movlw 16 //загружаем в регистр w константу 16 (столько будет проходов цикла, для умножения 2х 16 разрядных чисел)
movwf count,W //выгружаем регистр w в регситр count (в нем и будет вестись счетчик проходов цикла)
bcf STATUS,C //сбрасываем флаг переноса
loop rrf mulplr_H,F //начинаем цикл,двигаем вправо старшие разряды множителя через флаг перноса
rrf mulplr_L,F //двигаем вправо младшие разряды множителя
//резултат - имеем сдвинутое на разряд вправо 16-ричное число в расположенное в 2 х регистрах
btfsc STSTUS,C //проверяем флаг переноса
call summ //если он равен 1 то вызываем процедуру суммирования
rrf byte3,F //сдвигаем вправо разряды резултата через флаг переноса, аналогично множителю - сначала старшие (четвертый байт)
rrf byte2,F //сдвигаем третий байт
rrf byte1,F //сдвигаем второй байт
rrf byte0,F //ну и первый. результат - двигаем вправо на разряд всё 32 разрядное число расположенное в 4-х регистрах
decfsz count,F //декремент (вычитаем единицу) из регистра count и проверяем не равен ли регистр нулю
goto loop //если count не равен нулю (пока не равен) повторяем цикл c метки loop
retlw 0 //выходим из процедуры...
summ bcf STATUS,DC //процедура суммирования, cбрасываем флаг переноса разряда
movf mulcnd_L,W //загружаем младшие разряды множимого в W
addwf byte2, F //cуммируем младший байт множителя, с первым (младшим) байтом результата (byte0)
//--------------------------------------------------------------------------------------------------
//Из документации не понятно, учитывает ли команда addwf флаг переноса разряда автоматически,
//тоесть учитывается ли в суммировании перенесенный разряд, из предудущей операции,
//если нет, то тут надо вписать следующий кусок:
btfsc STATUS,DC
incf byte3,F
//--------------------------------------------------------------------------------------------------
movf mulcnd_H,W //загружаем старшие разряды множимого в W
addwf byte3,F //cуммируем старший байт множителя, с четвертым байтом результата (byte3)
retlw 0 //выход из процедуры суммирования...
Правда я абcолютно не уверен, что она правильная, и что она будет работать... но попытаться можно...
Комментарии:
mulplr_L - младший байт множителя
mulplr_H - старший байт множителя
mulcnd_L - младший байт множителя
mulcnd_H - старший байт множителя
byte0-byte3 - четыре байта результата
summ - процедура суммирования 16 разрядных чисел...
Вот в общем то и всё... - сдеално по аналогии с исходным кодом, возможно где то ошибся...
Сообщение отредактировал Sana - 15 Декабря 2004, 13:54
Саяногорск инфо - Саяногорский городской сайт
ICQ: 215340073 | e-mail: admin@sayanogorsk.info | Skype / Telegram: mrSana19
ICQ: 215340073 | e-mail: admin@sayanogorsk.info | Skype / Telegram: mrSana19