Главная страница  Комбинированное использование портов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [ 21 ] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

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



btfss

STATUS.CARRY

Необходимо сложение?

goto

NO.ADD

Нет.

movf

ACCaLO, w

Сложение (АССЬ + АССа -> АССЬ)

addwf

ACCbLO

Добавление младшего байта.

btfsc

STATUS.CARRY

Добавление переноса.

incf

ACCbHI

movf

ACCaHI, w

addwf

ACCbHI

Добавление старшего байта.

ACCbHI

Правый сдвиг.

ACCbLO

ACCcHI

ACCcLO ;

ENDM

Умножение с двойной точностью (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

SIGNED

btfss

sign,MSB

retlw

comf

ACCcLO

incf

ACCcLO

btfsc

STATUS,Z bit

decf

ACCcHI

comf

ACCcHI

btfsc

STATUS.Z bit

comf

ACCbLO

incf

ACCbLO

btfsc

STATUS.Z bit

decf

ACCbHI

comf

ACCbHI

retlw

retlw

ENDIF

**************

movlw

movwf

tenp

nravf

ACCbHI, w :

movwf

ACCdHI

movf

ACCbLO,w

movwf

ACCdLO

clrf

ACCbHI

clrf

ACCbLO

retlw

*************************** *******************♦********************************

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

movlw

movwf

ACCaHI

movlw

movwf

ACCaLO

movlw

07F-

ntovwf

ACCbHI

movlw

movwf

ACCbLO

retlw

call

loadAB

call

D mpyF

goto

self

PIC54

LIST

p=l6c54

goto

main

Загрузка константы 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



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [ 21 ] 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

© 2000 - 2022 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.