Главная страница Комбинированное использование портов retlw О j ****** ******y,( ; Раздел, ассемблируемый только для случая знакового умножения; F SIGNED S SI6N movf ACCaHI, W xorwt ACCbHI, W movwf sign btfss ACCbHI,MSB ; Если MSB = 1, изменение знака байта ACCbHI. Отрицание байта ACCbLO. goto chek A conf ACCbLO incf ACCbLO btfsc STATUS,Z bit decf ACCbHI comf ACCbHI chek A btfss ACCaHI,MSB ; Если MSB = 1, изменение знака байта ACCaHI. retlw 0 goto neg A ENDIF t******************************************************************************* ; Тестовая программа. ; Загрузка констант в байты АССа и АССЬ для теста. main movlw 1 movwf ACCaHI movlw OFF ; Загружаем константу 01FF в байт АССа. movwf ACCaLO movlw 07F movwf ACCbHI movlw OFF Загружаем константу 7FFF в байт АССЬ. movwf ACCbLO ; call D mpyS ; Результат (ACCb.ACCc) = OOFF 7E01. self goto self org PIC54 goto main ;1истинг4.4 ***t*************************************************************************** укножение 16x16 разрядов (быстрая версия). ******************************************************************************* Умножение АССЬ (16 битов) * АССа (16 битов) -> АССЬ,АССс (32 бита). (д) Первый операнд помещается в байты ACCaLO и ACCaHI (16 битов). (B) Второй операнд помещается в байты ACCbLO и ACCbHI (16 битов). (C) Вызов D MPYP. (D) Результат помещается в байты ACCbHI. ACCbLO, ACCcHI, ACCcLO. Показатели: объем памяти: 240; количество циклов: 233. Показатели даны для версий беззнакового умножения, т.е. с командой SIGNED equ FALSE. Программа соответствует инструкции по применению AN526 фирмы Microchip. ********************************************************************************* АССаШ equ ACCaHI equ ACCbLO equ AOCbHI equ ACCcLO equ ACCcHI equ ACCdLO equ ACCdHI equ temp equ sign equ Flags equ Ю 11 12 13 14 15 16 17 18 19 20 include mpreg.h org 0 ;********************************************************************************* SI№D equ FALSE ; TRUE для знаковой версии, ; FALSE для версии без знаков. ********************************************************************************* Макрос умножения. eulMac MACRO LOCAL NO ADD rrf ACCdHI ; Сдвиг вправо, rrf ACCdLO
Умножение с двойной точностью (16 х 16 -> 32). (АССЬ * АССа -> АССЬ,АССс): результат 32 бита. старшие байты результата (16Msb) помещаются в байт АССЬ (ACCbHI,ACCbLO), младшие байты результата (16Lsb) помещаются в байт АССс (ACCcHI.ACCcLO). D mpyF IF SIGNED CALL S SIGN ENDIF call setup ; Обращение к макрокоманде mulMac 16 раз. mulMac mulMac mulHac mulMac mulHac mulMac mulHac mulMac muIMac mulMac nulMac mulMac mulMac mulMac mulMac mulMac
*************************** *******************♦******************************** neg A comf ACCaLO ; Изменение знака байта АССа (-АССа -> АССа). incf ACCaLO btfsc STATUS.Z blt decf ACCaHI comf ACCaHI retlw 0 Раздел, ассемблируемый только для случая знаковой операции. IF SI(5NE0 S-SIGN movf ACCaHI, W xorwf ACCbHI. W movwf sign btfss ACCbHI,MSB ; Если MSB = 1, меняем знак в байте АССЬ. goto chek A conif ACCbLO ; Изменяем знак байта ACCbLO. incf ACCbLO btfsc STATUS,Z bit decf ACCbHI cofflf ACCbHI chek A btfss ACCaHI,MSB ; Если MSB = 1, меняем знак байта ACCaHI. retlw 0 goto neg A ENDIF Тестовая программа. ************** *******1,*****i,**tt*1,*1,ti,*******t*t***tt*IHr*1,*****t,********tt*i Загрузка констант в АССа и АССЬ для теста. Загрузка константы 01FF в АССа. main self
Загрузка константы 7FFF в АССЬ. Результат АССЬ * АССа -> (АССЬ, АССс). В этом случае (АССЬ, АССс) = 00FF 7Е01. Деление 16-разр$дных чисел Эта программа осуществляет деление двух 16-разрядных чис и возвращает результат в двух 16-разрядных словах, одно из которые представляет частное, а другое - остаток. Речь идет, таким oбpaзo о целочисленном делении. Программы используют возможност! яовного ассемблирования, ршеющиеся в ассемблере MPALC фир- jiicrochip. Чтобы создать программу беззнакового деления, до-хочно ассемблировать строку: Signed equ FALSE д чтобы получать программу деления чисел со знаками, надо заменить эту строку: Signed equ TRUE Быстрая и компактная версии программы даны в листингах 4.5 и 4.6: Ф быстрая версия требует 370 ячеек памяти и выполняется за 263 командных цикла микроконтроллера; компактная версия требует 37 ячеек памяти и выполняется за 310 циклов. В обоих программах делимое размещается в байтах ACCbHI и ACCbLO, а делитель - в ACCaHI и ACCaLO. Байты HI соответствуют старшим разрядам. Частное размещается в байтах ACCbHI и ACCbLO, а остаток -bACCcHI и ACCcLO. Лиаинг 4.5 ********************************************************************************* Деление 16-разрядных чисел (компактная версия). ********************************************************************************* Деление: АССЬ (16 бит) / АССа (16 бит) -> АССЬ (16 бит). Остаток помещается в АССс (16 бит). (А) Делитель помещается в байт ACCaHI и ACCaLO (16 бит). (0) Делимое помещается в байт ACCbHI и ACCbLO (16 бит). (C) Вызов D.div. (D) Частное (16 бит) помещается в байты ACCbHI и АССЫО. (E) Остаток (16 бит) помещается в байты ACCcHI и ACCcLO. Показатели: объем памяти: 037; количество циклов: 310. Показатели указаны для версии без знаков, то есть со строкой SIGNED equ FALSE. программа соответствует инструкции по применению AN526 фирмы Microchip. ********************************************************************************* LO equ ЛССаН! equ ACCbLO equ ACCbHI equ LO equ
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |