嵌入式设计应用
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
全部0条评论
快来发表一下你的评论吧 !