📄 16×16位定点数加、减法子程序.txt
字号:
;【校验举例2】 26222+3000=29222(十进制)
;化为十六进制数: 666EH+0BB8H
;结果:7226H(十六进制)
;【例程】
;2 四则运算子程序
; 2.1 16×16位定点数加、减法子程序
;以下子程序实现2个16×16位有符号数加、减运算,其和或差用一个16位数表示。
;在子程序中,减法是通过对减数求补后再与被减数相加来实现的。因此,当程序
;从D_sub进入子程序时为减法,当从D_add进入子程序时为加法。
;子程序的入口条件和出口条件如下:
;入口条件:16位被加数/被减数存放在ACCBHI、ACCBLO中;
; 16位加数/减数存放在ACCAHI、ACCALO中;
;出口条件:16位和/差存放在ACCBHI和ACCBLO中。
;以下为16×16位有符号数加、减法子程序。
;注意:在以下注释程序中均以ACCA代替ACCAHI、ACCALO两个字节,以
;ACCB代替ACCBHI、ACCBLO两个字节。
LIST p=16f877
INCLUDE p16f877.inc
ACCALO EQU 20 ;存放加数或减数低8位
ACCAHI EQU 21 ;存放加数或减数高8位
FULL EQU 22 ;22.0存放进位
ACCBLO EQU 23 ;存放被加数或被减数低8位
ACCBHI EQU 24 ;存放被加数或被减数高8位
ORG 0X0000
START GOTO MAIN
;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***
D_sub CALL NEG_A ;求ACCA的补码
;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_add MOVF ACCALO,0 ;ACCB和ACCA低半字节相加
ADDWF ACCBLO
BTFSC STATUS,C ;有进位否?
goto $+6 ;有,
MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加
ADDWF ACCBHI
BTFSC STATUS,C
BSF FULL,0
RETURN ;子程序返回
MOVFW ACCBHI ;ACCB高字节加1,再加ACCAHI
ADDLW 1h
BTFSC STATUS,C ;有进位否?
BSF FULL,0
MOVWF ACCBHI
GOTO $-D'10'
;************** ACCA取补子程序*****************
NEG_A COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有进位吗?
DECF ACCAHI ;有,ACCAHI减1,再取反
COMF ACCAHI ;否则ACCAHI直接取反
RETURN ;子程序返回
MAIN MOVLW 0X6E ;被加数666EH送ACCB
MOVWF ACCBLO
MOVLW 0X66
MOVWF ACCBHI
MOVLW 0XB8 ;加数BB8H送ACCA
MOVWF ACCALO
MOVLW 0X0B
MOVWF ACCAHI
CALL D_add ;调用双字节加法子程序,求和
goto $
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -