51单片机子程序调用c语言,MCS-51单片机实用子程序库(五)-1

(5) 标号: FDIV 功能:浮点数除法

入口条件:被除数在[R0]中,除数在[R1]中。

出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。

影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节

FDIV: INC R0

MOV A,@R0

INC R0

ORL A,@R0

DEC R0

DEC R0

JNZ DIV1

MOV @R0,#41H;被除数为零,不必运算

CLR OV

RET

DIV1: INC R1

MOV A,@R1

INC R1

ORL A,@R1

DEC R1

DEC R1

JNZ DIV2

SETB OV ;除数为零,溢出

RET

DIV2: LCALL MVR0 ;将[R0]传送到第一工作区中

MOV A,@R0

XRL A,@R1 ;比较两个操作数的符号

RLC A

MOV 1FH,C ;保存结果的符号

LCALL MVR1 ;将[R1]传送到第二工作区中

LCALL DIV3 ;调用工作区浮点除法

LJMP MOV0 ;回传结果

DIV3: CLR C ;比较尾数的大小

MOV A,R4

SUBB A,R7

MOV A,R3

SUBB A,R6

JC DIV4

LCALL RR1 ;被除数右规一次

SJMP DIV3

DIV4: CLR A ;借用R0R1R2作工作寄存器

XCH A,R0 ;清零并保护之

PUSH ACC

CLR A

XCH A,R1

PUSH ACC

MOV A,R2

PUSH ACC

MOV B,#10H ;除法运算,R3R4/R6R7-→R0R1

DIV5: CLR C

MOV A,R1

RLC A

MOV R1,A

MOV A,R0

RLC A

MOV R0,A

MOV A,R4

RLC A

MOV R4,A

XCH A,R3

RLC A

XCH A,R3

MOV F0,C

CLR C

SUBB A,R7

MOV R2,A

MOV A,R3

SUBB A,R6

ANL C,/F0

JC DIV6

MOV R3,A

MOV A,R2

MOV R4,A

INC R1

DIV6: DJNZ B,DIV5

MOV A,R6 ;四舍五入

CLR C

RRC A

SUBB A,R3

CLR A

ADDC A,R1 ;将结果存回R3R4

MOV R4,A

CLR A

ADDC A,R0

MOV R3,A

POP ACC ;恢复R0R1R2

MOV R2,A

POP ACC

MOV R1,A

POP ACC

MOV R0,A

MOV A,R2 ;计算商的阶码

CLR C

SUBB A,R5

LCALL MD ;阶码检验

LJMP RLN ;规格化

(6) 标号: FCLR 功能:浮点数清零

入口条件:操作数在[R0]中。

出口信息:操作数被清零。

影响资源:A 堆栈需求: 2字节

FCLR: INC R0

INC R0

CLR A

MOV @R0,A

DEC R0

MOV @R0,A

DEC R0

MOV @R0,#41H

RET

(7) 标号: FZER 功能:浮点数判零

入口条件:操作数在[R0]中。

出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。

影响资源:A 堆栈需求: 2字节

FZER: INC R0

INC R0

MOV A,@R0

DEC R0

ORL A,@R0

DEC R0

JNZ ZERO

MOV @R0,#41H

ZERO: RET

(8) 标号: FMOV 功能:浮点数传送

入口条件:源操作数在[R1]中,目标地址为[R0]。

出口信息:[R0]=[R1],[R1]不变。

影响资源:A 堆栈需求: 2字节

FMOV: INC R0

INC R0

INC R1

INC R1

MOV A,@R1

MOV @R0,A

DEC R0

DEC R1

MOV A,@R1

MOV @R0,A

DEC R0

DEC R1

MOV A,@R1

MOV @R0,A

RET

(9) 标号: FPUS 功能:浮点数压栈

入口条件:操作数在[R0]中。

出口信息:操作数压入栈顶。

影响资源:A、R2、R3 堆栈需求: 5字节

FPUS: POP ACC ;将返回地址保存在R2R3中

MOV R2,A

POP ACC

MOV R3,A

MOV A,@R0 ;将操作数压入堆栈

PUSH ACC

INC R0

MOV A,@R0

PUSH ACC

INC R0

MOV A,@R0

PUSH ACC

DEC R0

DEC R0

MOV A,R3 ;将返回地址压入堆栈

PUSH ACC

MOV A,R2

PUSH ACC

RET ;返回主程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值