MCS-51单片机实用子程序库(二)
(11) 标号: DIVS 功能:双字节二进制有符号数除法(补码) 入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。 出口信息:OV=0时商在R2、R3中,OV=1时溢出。 影响资源:PSW、A、B、R1~R7 堆栈需求: 5字节 DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值 PUSH PSW ;保存结果的符号 LCALL DIVD ;计算两个绝对值的商 JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去结果的符号,保留溢出标志 RET
DVS1: POP PSW ;未溢出,取出结果的符号 MOV R4,#0 MOV R5,#0
MDSE: JB F0,MDS2 ;用补码表示结果 CLR OV ;结果为正,原码即补码,计算成功 RET
MDS: CLR F0 ;结果符号初始化 MOV A,R6 ;判断第二操作数的符号 JNB ACC.7,MDS1;为正,不必处理 CPL F0 ;为负,结果符号取反
XCH A,R7 ;第二操作数取补,得到其绝对值 CPL A ADD A,#1 XCH A,R7 CPL A ADDC A,#0 MOV R6,A
MDS1: MOV A,R2 ;判断第一操作数或运算结果的符号 JNB ACC.7,MDS3;为正,不必处理 CPL F0 ;为负,结果符号取反
MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码 CPL A ADD A,#1 MOV R5,A MOV A,R4 CPL A ADDC A,#0 MOV R4,A MOV A,R3 CPL A ADDC A,#0 MOV R3,A
MOV A,R2 CPL A ADDC A,#0 MOV R2,A
MDS3: CLR OV ;运算成功 RET
(12) 标号: SH2 功能:双字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3中。
出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH2: MOV A,R2 ORL A,R3 JNZ SH20
RET ;被开方数为零,不必运算 SH20: MOV R7,#0 ;左规次数初始化 MOV A,R2
SH22: ANL A,#0C0H ;被开方数高字节小于40H否? JNZ SQRH ;不小于40H,左规格化完成,转开方过程 CLR C ;每左规一次,被开方数左移两位 MOV A,R3 RLC A MOV F0,C CLR C RLC A MOV R3,A MOV A,R2 MOV ACC.7,C MOV C,F0 RLC A RLC A MOV R2,A
INC R7 ;左规次数加一 SJMP SH22 ;继续左规
(13) 标号: SH4 功能:四字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3、R4、R5中。
出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。 影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 SH4: MOV A,R2 ORL A,R3 ORL A,R4 ORL A,R5
JNZ SH40
RET ;被开方数为零,不必运算 SH40: MOV R7,#0 ;左规次数初始化 MOV A,R2
SH41: ANL A,#0C0H ;被开方数高字节小于40H否? JNZ SQRH ;不小于40H,左规格化完成 MOV R6,#2 ;每左规一次,被开方数左移两位 SH42: 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 MOV A,R2 RLC A MOV R2,A
DJNZ R6,SH42 ;被开方数左移完