⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jrdmdysf.asm

📁 用增强型单片机51RD2做的控制器
💻 ASM
📖 第 1 页 / 共 2 页
字号:


;*****************************************************
;*                                                   *
;*              各种算法子程序                       *
;*                                                   *
;*****************************************************

;R2R3±R4R5->R6R7,R2,R4最高位分别是两个数的符号位,0为正,1为负,结束时C=1溢出,C=0无溢出
DBSUBB:
                MOV     A,R4
                CPL     ACC.7           ;减数符号位取反
                MOV     R4,A
DBADD:
                MOV     A,R2
                MOV     C,ACC.7
                MOV     F0,C            ;保存被加数符号位
                XRL     A,R4
                MOV     C,ACC.7         ;两数同号C=0,异号C=1
                MOV     A,R2
                CLR     ACC.7           ;符号位清零
                MOV     R2,A            ;取数值部分
                MOV     A,R4
                CLR     ACC.7           ;符号位清零
                MOV     R4,A            ;取数值部分
                JC      BX2
ADD1:
                MOV     A,R3            ;同号,两个双字节数相加
                ADD     A,R5            ;低位相加
                MOV     R7,A            ;存低位和
                MOV     A,R2
                ADDC    A,R4            ;高位相加
                MOV     R6,A            ;存高位和
                JB      ACC.7,BERR
BX1:
                MOV     C,F0            ;恢复结果符号
                MOV     ACC.7,C
                MOV     R6,A
                RET
BERR:
                SETB    C
                RET
BX2:
                MOV     A,R3            ;异号,两个双字节数相减
                CLR     C
                SUBB    A,R5            ;低位相减
                MOV     R7,A            ;存低位结果
                MOV     A,R2
                SUBB    A,R4            ;高位相减
                MOV     R6,A            ;存高位结果
                JNB     ACC.7,BX1       ;判断结果符号,为正转BX1
BMP:
                MOV     A,R7            ;符号为负,差求补
                CPL     A
                ADD     A,#1
                MOV     R7,A
                MOV     A,R6
                CPL     A
                ADDC    A,#0
                MOV     R6,A
                CPL     F0              ;保存在用户标志位F0中符号取反
                SJMP    BX1
;    将 (高R2,R3)和(高R6,R7)中双字节无符号整数相乘,
;    乘积送(高)R4,R5,R6,R7(低) 中
;       ******  双字节无符号乘法  ******
;
TowByteNMUL:    MOV     R4,#0
                MOV     R5,#0
                MOV     R0,#16
                CLR     C
TowByteNMUL1:   MOV     A,R4
                RRC     A
                MOV     R4,A
                MOV     A,R5
                RRC     A
                MOV     R5,A
                MOV     A,R6
                RRC     A
                MOV     R6,A
                MOV     A,R7
                RRC     A
                MOV     R7,A
                JNC     TowByteNMUL2
                MOV     A,R5
                ADD     A,R3
                MOV     R5,A
                MOV     A,R4
                ADDC    A,R2
                MOV     R4,A
TowByteNMUL2:   DJNZ    R0,TowByteNMUL1
                MOV     A,R4
                RRC     A
                MOV     R4,A
                MOV     A,R5
                RRC     A
                MOV     R5,A
                MOV     A,R6
                RRC     A
                MOV     R6,A
                MOV     A,R7
                RRC     A
                MOV     R7,A
                RET

; 将 (高R2 R3 R4 R5低) 四字节无符号整数除以(高R6 R7低)双
; 字节无符号数,商存放于(高R4 R5低)中,余数存放(高R2 R3低)中
;
;       ******  双字节无符号除法  ******
;
TowByteNDIV:    MOV     A,R3
                CLR     C
                SUBB    A,R7
                MOV     A,R2
                SUBB    A,R6
                JNC     TowByteNDIV4
                MOV     B,#16
TowByteNDIV1:   CLR     C
                MOV     A,R5
                RLC     A
                MOV     R5,A
                MOV     A,R4
                RLC     A
                MOV     R4,A
                MOV     A,R3
                RLC     A
                MOV     R3,A
                XCH     A,R2
                RLC     A
                XCH     A,R2
                MOV     PSW.5,C
                CLR     C
                SUBB    A,R7
                MOV     R1,A
                MOV     A,R2
                SUBB    A,R6
                JB      PSW.5,TowByteNDIV2
                JC      TowByteNDIV3
TowByteNDIV2:   MOV     R2,A
                MOV     A,R1
                MOV     R3,A
                INC     R5
TowByteNDIV3:   DJNZ    B,TowByteNDIV1
                CLR     PSW.5
                RET
TowByteNDIV4:   SETB    PSW.5
                RET


; 调用BinToBcd子程序时,16位二进制整数存放于R2(高8位)R3(低8位)
; 从BinToBcd返回时,三字节压缩BCD码结果在R4,R5,R6其中高位R4,低位R6
;
;    ****** 双字节二进制数转换为BCD数子程序 ******
;
BinToBcd:       CLR     A
                MOV     R4,A
                MOV     R5,A
                MOV     R6,A
                MOV     R7,#16
BinToBcd1:      CLR     C
                MOV     A,R3
                RLC     A
                MOV     R3,A
                MOV     A,R2
                RLC     A
                MOV     R2,A
                MOV     A,R6
                ADDC    A,R6
                DA      A
                MOV     R6,A
                MOV     A,R5
                ADDC    A,R5
                DA      A
                MOV     R5,A
                MOV     A,R4
                ADDC    A,R4
                DA      A
                MOV     R4,A
                DJNZ    R7,BinToBcd1
                RET
;
; 将R0指向的内部RAM中多字节十进制整数(R0低位R0+1高位)
; 转换为二进制整数,存入R1指向的内部RAM单元中(R1低R1+1高)
; R7为BCD码的个数
;
; ****** 多字节压缩BCD码转换为二进制数  ******
;
BcdToBin:       MOV     A,R1
                MOV     R6,A
                MOV     A,R7
                MOV     R3,A
                CLR     A
BcdToBin1:      MOV     @R1,A
                INC     R1
                DJNZ    R3,BcdToBin1
                MOV     A,R7
                MOV     R3,A
BcdToBin2:      LCALL   BcdToBin3
                MOV     A,@R0
                ANL     A,#0F0H
                SWAP    A
                LCALL   BcdToBin5
                LCALL   BcdToBin3
                MOV     A,@R0
                ANL     A,#0FH
                LCALL   BcdToBin5
                DEC     R0
                DJNZ    R3,BcdToBin2
                RET
BcdToBin3:      MOV     A,R7
                MOV     R4,A
                MOV     A,R6
                MOV     R1,A
                CLR     C
                MOV     R2,#00H
BcdToBin4:      MOV     A,@R1
                MOV     B,#0AH
                PUSH    PSW
                MUL     AB
                POP     PSW
                ADDC    A,R2
                MOV     @R1,A
                MOV     R2,B
                INC     R1
                DJNZ    R4,BcdToBin4
                RET
BcdToBin5:      MOV     R5,A
                MOV     A,R6
                MOV     R1,A
                MOV     A,R7
                MOV     R4,A
                MOV     A,R5
                ADD     A,@R1
                MOV     @R1,A
                INC     R1
                DEC     R4
                MOV     A,R4
                JNZ     BcdToBin6
                RET
BcdToBin6:      MOV     A,@R1
                ADDC    A,#00H
                MOV     @R1,A
                INC     R1
                DJNZ    R4,BcdToBin6
                RET

;功能: 对(RO)指向的三字节数进行左规格化
;入口:   (RO)指向内部RAM中的浮点数
;出口:   (RO)=addr;内部RAM中addr-addr+2单元内为规化了的三字节浮点数。
;
; ************  1、浮点数左规格化子程序NORM  **********
;
NORM:		MOV	A,@R0				; 数的符号保护到用户标志位
		MOV	C,ACC.7
		MOV	PSW.5,C
		INC	R0
		MOV	C,ACC.6				; 扩展阶码为双符号位
		MOV	ACC.7,C
		MOV	R2,A
NORM1:		MOV	A,@R0
		INC	R0
		JNZ	NORM3
		MOV	A,@R0
		JNZ	NORM4
		DEC	R0				; 尾数为0
		DEC	R0
		MOV	A,#40H				; 置阶码最小值
NORM2:		MOV	C,PSW.5
		MOV	ACC.7,C
		MOV	@R0,A
		RET
NORM3:		JB	ACC.7,NORM5
NORM4:		CLR	C				; 尾数左移一位
		MOV	A,@R0
		RLC	A
		MOV	@R0,A
		DEC	R0
		MOV	A,@R0
		RLC	A
		MOV	@R0,A
		INC	R0
		DEC	R2				; 阶码减1
		CJNE	R2,#0C0H,NORM3
NORM5:		DEC	R0
		DEC	R0
		MOV	A,@R0
		SJMP	NORM2
;功能:入口  CY=0时,执行右规格化,右移输入位为39H。
;      F0=0时,对R6(阶)R2R3(尾数)进行右移一位
;      F0=1时,对R7(阶)R4R5(尾数)进行右移一位。
;      CY=1时,对R6(阶)R2R3(尾数)进行左规格化,第一次左移输入位为F0。
;
; ************* 2、通用规格化子程序FSDT  *************
;
FSDT:		JC	FS2
		MOV	C,39H				; 右规格化
		JB	PSW.5,FS1
		MOV	A,R2
		RRC	A
		MOV	R2,A
		MOV	A,R3
		RRC	A
		MOV	A,R3
		INC	R6
		RET
FS1:		MOV	A,R4				; R7R4R5右移一位
		RRC	A
		MOV	R4,A
		MOV	A,R5
		RRC	A
		MOV	R5,A
		INC	R7
		RET
FS2:		MOV	A,R2				; 左规格化
		JNZ	FS4
		CJNE	R3,#0,FS5
		MOV	R6,#41H				; 尾数等于0,41H送阶码
FS3:		RET
FS4:		JB	ACC.7,FS3
FS5:		MOV	C,PSW.5				; 左移输入为F0
		MOV	A,R3
		RLC	A
		MOV	R3,A
		MOV	A,R2
		RLC	A
		MOV	R2,A
		CLR	PSW.5
		DEC	R6
		SJMP	FS2
;功能:把(R0)指向的内部RAM中的三字节浮点数送到R6R2R3,把(R1)指向的内部
;RAM中的三字节浮点数送到R7R4R5,并保持R0、R1的内容不变。
;
; ************  3、浮点取数子程序FMLD  ************
;
FMLD:		MOV	A,@R0				; 取操作数1
		MOV	R6,A
		INC	R0
		MOV	A,@R0
		MOV	R2,A
		INC	R0
		MOV	A,@R0
		MOV	R3,A
		DEC	R0				; 恢复(R0)的值
		DEC	R0
		MOV	A,@R1				; 取操作数2
		MOV	R7,A
		INC	R1
		MOV	A,@R1
		MOV	R4,A
		INC	R1
		MOV	A,@R1
		MOV	R5,A
		DEC	R1				; 恢复(R1)值
		DEC	R1
		RET
;功能:把R4R2R3中的浮点数送到(R1)指向的内部RAM单元中。
;
; ************  4、浮点数存数了程序FSTR  ************
;
FSTR:		MOV	A,R4				; 存结果
		MOV	@R1,A
		INC	R1
		MOV	A,R2
		MOV	@R1,A
		INC	R1
		MOV	A,R3
		MOV	@R1,A
		DEC	R1				; 恢复(R1值)
		DEC	R1
		RET
;功能:把R6R2R3和R7R4R5的两上三字节浮点数进行相加或相减,结果存放在R4R2R3中。
;入口时,Bit3AH=0时,加;否则为减。
;
; ************  5、浮点数加、减法处理子程序FABP  ************
;
FABP:		MOV	A,R6
		MOV	C,ACC.7
		MOV	38H,C				; 保存被加数符号
		XRL	A,R7
		JNB	ACC.7,FA1
		CPL	3AH				; 两数异号,取反运算标志
FA1:		MOV	A,R6
		MOV	C,ACC.6				; 扩展阶码为双符号位
		MOV	ACC.7,C
		MOV	R6,A
		MOV	A,R7
		MOV	C,ACC.6
		MOV	ACC.7,C
		MOV	R7,A
		CLR	C
		MOV	A,R6
		SUBB	A,R7
		JZ	FA2
		CLR	PSW.5
		CLR	39H
		JB	ACC.7,FA5
		CJNE	R4,#0,FA6
		CJNE	R5,#0,FA6
FA2:		JB	3AH,FA8
		MOV	A,R3				; 执行尾数加法
		ADD	A,R5
		MOV	R3,A
		MOV	A,R2
		ADDC	A,R4
		MOV	R2,A
		JNC	FA4
		SETB	39H				; 溢出,把尾数右移一位
		CLR	C
FA3:		CLR	PSW.5
		LCALL	FSDT
FA4:		CJNE	R2,#0,FAA
		CJNE	R3,#0,FAA
		MOV	R4,#41H				; 结果为0
		RET
FAA:		MOV	A,R6				; 送结果的符号
		MOV	C,38H
		MOV	ACC.7,C
		XCH	A,R4
		MOV	R6,A
		RET
FA5:		CJNE	R2,#0,FA7
		CJNE	R3,#0,FA7
		MOV	A,R7
		MOV	R6,A
		SJMP	FA2
FA6:		CPL	PSW.5
FA7:		CLR	C
		LCALL	FSDT
		SJMP	FA1
FA8:		MOV	A,R3				; 执行尾数减法
		CLR	C
		SUBB	A,R5
		MOV	R3,A
		MOV	A,R2
		SUBB	A,R4
		MOV	R2,A
		JNC	FA9
		CLR	A				; 不够减
		CLR	C				; 把尾数取补
		SUBB	A,R3
		MOV	R3,A
		CLR	A
		SUBB	A,R2
		MOV	R2,A
		CPL	38H				; 结果符号取反
FA9:		SETB	C
		SJMP	FA3

;功能:(R0)指向的三字节浮数和(R1)指向的三字节浮点数相加,结果存放在R4R3R3
;       中,并保持R0R1的内容不变。
;
; ************  6、浮点数加法了程序FADD  ************
;
FADD:		CLR	3AH				; 置加法标志
		LCALL	FMLD				; 取操作数
		LCALL	FABP				; 加法
		RET
;功能:将(R0)指向的内部RAM中的三字节浮点数减去(R1)指向的内部RAM中
;的三字节浮点数,其差送R4R2R3,且不改变R0、R1和RAM中的内容。
;
; ************  7、浮点数减法子程序FSUB  ************
;
FSUB:		SETB	3AH				; 置减法标志
		LCALL	FMLD				; 取操作数
		LCALL	FABP				; 减法
		RET
;功能:将(R0)指向的内部RAM中的三字节浮点数和(R1)指向的内部RAM中
;的三字节浮点数相乘,积送R4R2R3中,不改变R0、R1和RAM中内容。
;
; ************  8、浮点数乘法子程序FMUL  ************
;
FMUL:		LCALL	FMLD
		MOV	A,R6
		XRL	A,R7
		MOV	C,ACC.7
		MOV	38H,C				; 计算并暂存积的符号
		LCALL	DMUL				; 调用定点无符号双字节乘法子程序
		MOV	A,R7
		MOV	C,ACC.7
		MOV	PSW.5,C				; F0为规格化时第一次左移输入值
		MOV	A,@R0				; 计算阶码
		ADD	A,@R1
		MOV	R6,A
		SETB	C
		LCALL	FSDT
		MOV	A,R6
		MOV	C,38H				; 回送积的符号
		MOV	ACC.7,C
		MOV	R4,A
		RET
DMUL:		MOV	A,R3				; 定点无符号双字节乘法子程序
		MOV	B,R5
		MUL	AB
		MOV	R7,B
		MOV	A,R3
                MOV     B,R4
                MUL     AB
                ADD     A,R7
                MOV     R7,A
                CLR     A
		ADDC	A,B
		MOV	R3,A
		MOV	A,R2
		MOV	B,R5
		MUL	AB
		ADD	A,R7
		MOV	R7,A
		MOV	A,R3
		ADDC	A,B
		MOV	R3,A
		MOV	PSW.5,C
		MOV	A,R2
		MOV	B,R4
		MUL	AB
		ADD	A,R3
		MOV	R3,A
		CLR	A
		ADDC	A,B
		MOV	C,PSW.5
		ADDC	A,#0
		MOV	R2,A
		RET
;功能:将(R0)指向的内部RAM中的浮点数除以(R1)指向的内部RAM中
;的浮点数,商送R4R2R#,不改变R0、R1和内部RAM中的操作内容。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -