一、编写子程序Mpy_16,实现双字节无符号数乘法。自行定义变量,其中:
- ACCALO ;存放乘数低 8 位
- ACCAHI ;存放乘数高 8 位
- ACCBLO ;存放被乘数低 8 位和乘积第 16~23 位
- ACCBHI ;存放被乘数高 8 位和乘积第 24~31 位
- ACCCLO ;存放乘积第 0~7 位
- ACCCHI ;存放乘积第 8~15 位
编写Main主程序,使用乘数 0x4015和被乘数0x3321对编写的子程序进行测试,结果应为0x0CCC71B5。
程序框图:
list p=16f877A ;标明所用的处理器类型
#include ;调用头文件
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;*****************变量定义*******************************************************
ACCALO EQU 0x20 ;存放乘数低8位
ACCAHI EQU 0x21 ;存放乘数高8位
ACCBLO EQU 0x22 ;存放被乘数低 8 位和乘积第 16~23 位
ACCBHI EQU 0x23 ;存放被乘数高 8 位和乘积第 24~31 位
ACCCLO EQU 0x24 ;存放乘积第 0~7 位
ACCCHI EQU 0x25 ;存放乘积第 8~15 位
ACCDLO EQU 0x26 ;临时寄存器
ACCDHI EQU 0x27 ;临时寄存器
TEMP EQU 0x28 ;临时寄存器
;*******************************************************************************
ORG 0x0000 ; 复位入口地址
nop ; 兼容ICD调试工具,必须加nop
goto Main ; 跳转至Main函数
;*************************Main 函数的代码****************************************
Main
MOVLW 0x21 ; 被乘数0x3321送ACCB
MOVWF ACCBLO
MOVLW 0x33
MOVWF ACCBHI
MOVLW 0x15 ; 乘数0x4015送ACCA
MOVWF ACCALO
MOVLW 0x40
MOVWF ACCAHI
CALL Mpy_16 ; 调用双字节无符号数乘法子程序,求积,结果应为0xCCC71B5
nop
goto $ ; 停机
;*********************************8 ×8 位无符号乘法子程序 ********************
ORG 0X0100
Mpy_16
CALL SETUP ;调用子程序,将ACCB的值送ACCD
MLOOP
BCF STATUS, C ;清进位位
RRF ACCDHI ;ACCD右移
RRF ACCDLO
BTFSC STATUS, C ;判断是否需要相加
CALL Add_16 ;加乘数至 MB
RRF ACCBHI ;右移部分乘积
RRF ACCBLO
RRF ACCCHI
RRF ACCCLO
DECFSZ TEMP ;乘法完成否?
GOTO MLOOP ;否,继续求乘积
RETURN ;子程序返回
;*****************************************************************************
SETUP
MOVLW .16 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBLO, W ;被乘数送ACCD
MOVWF ACCDLO
MOVF ACCBHI, W
MOVWF ACCDHI
CLRF ACCBLO ;清ACCB
CLRF ACCBHI
CLRF ACCCLO ;清ACCC
CLRF ACCCHI
RETURN ;子程序返回
;****************************************************************************
Add_16
MOVF ACCALO, W ;ACCA和ACCB低8位相加
ADDWF ACCBLO, F
BTFSC STATUS, C ;有进位否?
INCF ACCBHI, F ;有,ACCB高位加1
MOVF ACCAHI, W ;ACCA和ACCB高8位相加
ADDWF ACCBHI, F
RETURN ;子程序返回
;*****************************************************************************
END ; 程序结束
二、编写宏命令Mpy_16,实现单字节无符号数乘法。编写Main主程序调用宏命令并对运算结果进行测试。
程序框图:
list p=16f877A ;标明所用的处理器类型
#include ;调用头文件
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;******************************************************************************
Mpy_16 macro ACCALO1,ACCAHI1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,ACCDLO1,ACCDHI1,TEMP1
SETUP TEMP1,ACCBLO1,ACCBHI1,ACCCLO1,ACCCHI1,ACCDLO1,ACCDHI1 ;将ACCB的值送ACCD
MLOOP
BCF STATUS, C ;清进位位
RRF ACCDHI1 ;ACCD右移
RRF ACCDLO1
BTFSS STATUS, C ;判断是否需要相加
GOTO NEXT
Add_16 ACCALO1,ACCAHI1,ACCBLO1,ACCBHI1 ;加乘数至 MB
NEXT
RRF ACCBHI1 ;右移部分乘积
RRF ACCBLO1
RRF ACCCHI1
RRF ACCCLO1
DECFSZ TEMP1 ;乘法完成否?
GOTO MLOOP ;否,继续求乘积
ENDM
;*********************************************************************************
SETUP macro TEMP2,ACCBLO2,ACCBHI2,ACCCLO2,ACCCHI2,ACCDLO2,ACCDHI2
MOVLW .16 ;初始化TEMP寄存器
MOVWF TEMP2
MOVF ACCBLO2, W ;被乘数送ACCD
MOVWF ACCDLO2
MOVF ACCBHI2, W
MOVWF ACCDHI2
CLRF ACCBLO2 ;清ACCB
CLRF ACCBHI2
CLRF ACCCLO2 ;清ACCC
CLRF ACCCHI2
ENDM
;********************************************************************************
Add_16 macro ACCALO3,ACCAHI3,ACCBLO3,ACCBHI3
MOVF ACCALO3, W ;ACCA和ACCB低8位相加
ADDWF ACCBLO3, F
BTFSC STATUS, C ;有进位否?
INCF ACCBHI3, F ;有,ACCB高位加1
MOVF ACCAHI3, W ;ACCA和ACCB高8位相加
ADDWF ACCBHI3, F
ENDM ;结束宏指令定义
;****************************************************************
ACCALO EQU 0x20 ;存放乘数低8位
ACCAHI EQU 0x21 ;存放乘数高8位
ACCBLO EQU 0x22 ;存放被乘数低 8 位和乘积第 16~23 位
ACCBHI EQU 0x23 ;存放被乘数高 8 位和乘积第 24~31 位
ACCCLO EQU 0x24 ;存放乘积第 0~7 位
ACCCHI EQU 0x25 ;存放乘积第 8~15 位
ACCDLO EQU 0x26 ;临时寄存器
ACCDHI EQU 0x27 ;临时寄存器
TEMP EQU 0x28 ;临时寄存器
;****************************************************************************
ORG 0x0000 ; 复位入口地址
nop ; 兼容ICD调试工具,必须加nop
goto Main ; 跳转至Main函数
;**************************************Main 函数的代码***********************
Main
MOVLW 0x21 ; 被乘数0x3321送ACCB
MOVWF ACCBLO
MOVLW 0x33
MOVWF ACCBHI
MOVLW 0x15 ; 乘数0x4015送ACCA
MOVWF ACCALO
MOVLW 0x40
MOVWF ACCAHI
Mpy_16 ACCALO,ACCAHI,ACCBLO,ACCBHI,ACCCLO,ACCCHI,ACCDLO,ACCDHI,TEMP
;调用宏指令,求积,结果应为0xCCC71B5
nop
goto $ ; 停机
;******************************************************************************
END ; 程序结束