📄 jrdmdysf.asm
字号:
;*****************************************************
;* *
;* 各种算法子程序 *
;* *
;*****************************************************
;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 + -