?? 16×16位定點數(shù)乘法子程序.txt
字號:
;【校驗舉例2】 16405×13089=214725045(十進(jìn)制)
;化為十六進(jìn)制數(shù):4015H×3321H
;結(jié)果:0CCC71B5H(十六進(jìn)制)
;2.2 16×16位定點數(shù)乘法子程序
;子程序采用部分積右移加法實現(xiàn)乘法運算。乘數(shù)和被乘數(shù)分別為16位二進(jìn)制
;有符號數(shù)(均采用補(bǔ)碼表示,第16位為符號位),積為32位二進(jìn)制有符號數(shù),
;第32位為符號位。子程序的入口條件和出口條件如下:
;入口條件:被乘數(shù)存放在ACCBHI和ACCBLO單元中,
; 乘數(shù)存放在ACCAHI和ACCALO單元中。
;出口條件:積存放在ACCBHI、ACCBLO、ACCCHI和ACCCLO單元中,ACCB為高16位,
;ACCC為低16位。
;以下為本子程序的程序清單:
LIST p=16f877
INCLUDE p16f877.inc
ACCALO EQU 20h ;存放乘數(shù)低8位
ACCAHI EQU 21h ;存放乘數(shù)高8位
ACCBLO EQU 23h ;存放被乘數(shù)低8位和乘積第16~23位
ACCBHI EQU 24h ;存放被乘數(shù)高8位和乘積第24~31位
ACCCLO EQU 26h ;存放乘積低8位
ACCCHI EQU 27h ;存放乘積高8位
ACCDLO EQU 28h ;臨時寄存器
ACCDHI EQU 29h ;臨時寄存器
TEMP EQU 2Ah ;臨時寄存器
SIGN EQU 2Bh ;存放乘積的符號
FULL EQU 2C ;2C.0存放進(jìn)位
ORG 0X0000
START GOTO MAIN
;***16×16位乘法子程序,入口地址ACCB×ACCA,出口地址ACCB和ACCC ***
ORG 0X0100
D_mpy CALL S_SIGN ;求取乘積的符號,并對負(fù)數(shù)取補(bǔ)
CALL SETUP ;調(diào)用子程序,將ACCB的值送ACCD
INCF TEMP
CLRF ACCCHI ;清ACCC
CLRF ACCCLO
MLOOP BCF STATUS,C ;清進(jìn)位位
RRF ACCDHI ;ACCD右移
RRF ACCDLO
BTFSC STATUS,C ;判斷是否需要相加
CALL D_add ;加乘數(shù)至ACCB,見加法程序
BCF STATUS,C ;清進(jìn)位位
RRF ACCBHI ;右移部分乘積
RRF ACCBLO
RRF ACCCHI
RRF ACCCLO
DECFSZ TEMP ;乘法完成否?
GOTO MLOOP ;否,繼續(xù)求乘積
BTFSS SIGN,7 ;是,確定乘積的符號
GOTO OVER ;為正,乘法結(jié)束
COMF ACCCLO ;為負(fù),乘積取補(bǔ)
INCF ACCCLO
BTFSC STATUS,Z
DECF ACCCHI
COMF ACCCHI
BTFSC STATUS,Z
NEG_B DECF ACCBLO ;
COMF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
OVER RETURN ;子程序返回
;***雙字節(jié)加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_add MOVF ACCALO,0 ;ACCB和ACCA低半字節(jié)相加
ADDWF ACCBLO
BTFSC STATUS,C ;有進(jìn)位否?
goto $+6 ;有,
MOVF ACCAHI,0 ;ACCA、ACCB高半字節(jié)相加
ADDWF ACCBHI
BTFSC STATUS,C
BSF FULL,0
RETURN ;子程序返回
MOVFW ACCBHI ;ACCB高字節(jié)加1,再加ACCAHI
ADDLW 1h
BTFSC STATUS,C ;有進(jìn)位否?
BSF FULL,0
MOVWF ACCBHI
GOTO $-D'10'
;****************************************
SETUP MOVLW .15 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBHI,0 ;ACCB送ACCD
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI ;清ACCB
CLRF ACCBLO
RETURN ;子程序返回
;*******乘法運算確定結(jié)果符號判斷子程序******
S_SIGN MOVF ACCAHI,0 ;ACCAHI異或ACCBHI,結(jié)果送SIGN單元
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7 ;ACCB為負(fù)嗎?
GOTO CHEK_A ;否,檢查ACCA
CALL NEG_B ;是,求取ACCB絕對值
CHEK_A BTFSC ACCAHI,7 ;ACCA為負(fù)嗎?
CALL NEG_A ;ACCA為負(fù),求取ACCA絕對值,
;見雙字節(jié)加法程序
RETURN ;ACCA和ACCB均為正,返回
NEG_A COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有進(jìn)位嗎?
DECF ACCAHI ;有,ACCAHI減1,再取反
COMF ACCAHI ;否則ACCAHI直接取反
RETURN ;子程序返回
MAIN MOVLW 0X15 ;被乘數(shù)4015H送ACCB
MOVWF ACCBLO
MOVLW 0X40
MOVWF ACCBHI
MOVLW 0X21 ;乘數(shù)3321H送ACCA
MOVWF ACCALO
MOVLW 0X33
MOVWF ACCAHI
CALL D_mpy ;調(diào)用雙字節(jié)乘法子程序,求積
GOTO $
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -