PIC乘法程序一
;*******************************************************************
;?????????????????? 8x8 Software Multiplier
;?????????????? ( Code Efficient : Looped Code )
;*******************************************************************
;
;?? The 16 bit result is stored in 2 bytes
;
; Before calling the subroutine " mpy ", the multiplier should
; be loaded in location " mulplr ", and the multiplicand in
; " mulcnd " . The 16 bit result is stored in locations
; H_byte & L_byte.
;
;?????? Performance :
;?????????????????????? Program Memory? :? 15 locations
;?????????????????????? # of cycles???? :? 71
;?????????????????????? Scratch RAM???? :?? 0 locations
;
;? This routine is optimized for code efficiency ( looped code )
;? For time efficiency code refer to "mult8x8F.asm" ( straight line code )
;*******************************************************************
;
mulcnd? equ???? 09????? ; 8 bit multiplicand
mulplr? equ???? 10????? ; 8 bit multiplier
H_byte? equ???? 12????? ; High byte of the 16 bit result
L_byte? equ???? 13????? ; Low byte of the 16 bit result
count?? equ???? 14????? ; loop counter
;
;
?include???????? "picreg.h"
;
; *****************************???????? Begin Multiplier Routine
mpy_S?? clrf??? H_byte
?clrf??? L_byte
?movlw?? 8
?movwf?? count
?movf??? mulcnd,w
?bcf???? STATUS,CARRY??? ; Clear the carry bit in the status Reg.
loop??? rrf???? mulplr
?btfsc?? STATUS,CARRY
?addwf?? H_byte,Same
?rrf???? H_byte,Same
?rrf???? L_byte,Same
?decfsz? count
?goto??? loop
;
?retlw?? 0
;
;*************************************************************
;?????????????? Test Program
;**************************************************************
main??? movlw?? 0FF
?movwf?? mulplr????????? ; multiplier (in mulplr) = 0FF
?movlw?? 0FF???????????? ; multiplicand(W Reg )?? = 0FF
?movwf?? mulcnd
;
?call??? mpy_S?????????? ; The result 0FF*0FF = FE01 is in locations
;?????????????????????????????? ; H_byte & L_byte
;
self??? goto??? self
;
?org???? 01FF
?goto??? main
;
?END
PIC乘法程序二:
;*******************************************************************
;?????????????????? 8x8 Software Multiplier
;?????????????? ( Fast Version : Straight Line Code )
;*******************************************************************
;
;?? The 16 bit result is stored in 2 bytes
;
; Before calling the subroutine " mpy ", the multiplier should
; be loaded in location " mulplr ", and the multiplicand in
; " mulcnd " . The 16 bit result is stored in locations
; H_byte & L_byte.
;
;?????? Performance :
;?????????????????????? Program Memory? :? 35 locations
;?????????????????????? # of cycles???? :? 37
;?????????????????????? Scratch RAM???? :?? 0 locations
;
;? This routine is optimized for speed efficiency ( straight line code )
;? For code efficiency, refer to "mult8x8S.asm" ( looped code )
;*******************************************************************
;
mulcnd? equ???? 09????? ; 8 bit multiplicand
mulplr? equ???? 10????? ; 8 bit multiplier
H_byte? equ???? 12????? ; High byte of the 16 bit result
L_byte? equ???? 13????? ; Low byte of the 16 bit result
;
;
?include???????? "picreg.h"
;
;****?? Define a macro for adding & right shifting? **
;
mult??? MACRO?? bit???????????? ; Begin macro
?btfsc?? mulplr,bit
?addwf?? H_byte,Same
?rrf???? H_byte,Same
?rrf???? L_byte,Same
?ENDM??????????????????? ; End of macro
;
; *****************************???????? Begin Multiplier Routine
mpy_F?? clrf??? H_byte
?clrf??? L_byte
?movf??? mulcnd,w??????? ; move the multiplicand to W reg.
?bcf???? STATUS,CARRY??? ; Clear the carry bit in the status Reg.
?mult??? 0
?mult??? 1
?mult??? 2
?mult??? 3
?mult??? 4
?mult??? 5
?mult??? 6
?mult??? 7
;
?retlw?? 0
;
;********************************************************************
;?????????????? Test Program
;*********************************************************************
main??? movlw?? 0FF
?movwf?? mulplr????????? ; multiplier (in mulplr)???? = 0FF
?movlw?? 0FF
?movwf?? mulcnd????????? ; multiplicand(in mulcnd )?? = 0FF
;
?call??? mpy_F?????????? ; The result 0FF*0FF = FE01 is in locations
;?????????????????????????????? ; H_byte & L_byte
;
self??? goto??? self
;
?org???? 01FF
?goto??? main
;
?END
評論
查看更多