首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MCS-51浮点运算子程序及其使用说明(4)

MCS-51浮点运算子程序及其使用说明(4)

(11) 标号: FCMP 功能:浮点数代数值比较(不影响待比较操作数)



入口条件:待比较操作数分别在[R0]和[R1]中。

出口信息:若CY=1,则[R0] < [R1],若CY=0且A=0则 [R0] = [R1],否则[R0] > [R1]。

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

FCMP: MOV A,@R0 ;数符比较

XRL A,@R1

JNB ACC.7,CMP2

MOV A,@R0 ;两数异号,以[R0]数符为准

RLC A

MOV A,#0FFH

RET

CMP2: MOV A,@R1 ;两数同号,准备比较阶码

MOV C,ACC.6

MOV ACC.7,C

MOV B,A

MOV A,@R0

MOV C,ACC.7

MOV F0,C ;保存[R0]的数符

MOV C,ACC.6

MOV ACC.7,C

CLR C ;比较阶码

SUBB A,B

JZ CMP6

RLC A ;取阶码之差的符号

JNB F0,CMP5

CPL C ;[R0]为负时,结果取反

CMP5: MOV A,#0FFH ;两数不相等

RET

CMP6: INC R0 ;阶码相同时,准备比较尾数

INC R0

INC R1

INC R1

CLR C

MOV A,@R0

SUBB A,@R1

MOV B,A ;保存部分差

DEC R0

DEC R1

MOV A,@R0

SUBB A,@R1

DEC R0

DEC R1

ORL A,B ;生成是否相等信息

JZ CMP7

JNB F0,CMP7

CPL C ;[R0]为负时,结果取反

CMP7: RET




(12) 标号: FABS 功能:浮点绝对值函数



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

出口信息:结果仍在[R0]中。

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

FABS: MOV A,@R0 ;读取操作数的阶码

CLR ACC.7 ;清除数符

MOV @R0,A ;回传阶码

RET



(13) 标号: FSGN 功能:浮点符号函数




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

出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零。

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

FSGN: INC R0 ;读尾数

MOV A,@R0

INC R0

ORL A,@R0

DEC R0

DEC R0

JNZ SGN

RET ;尾数为零,结束

SGN: MOV A,@R0 ;读取操作数的阶码

RLC A ;取数符

MOV A,#1 ;按正数初始化

JNC SGN1 ;是正数,结束

MOV A,#0FFH ;是负数,改变标志

SGN1: RET



(14) 标号: FINT 功能:浮点取整函数



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

出口信息:结果仍在[R0]中。

影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节

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

LCALL INT ;在工作寄存器中完成取整运算

LJMP MOV0 ;将结果传回到[R0]中

INT: MOV A,R3

ORL A,R4

JNZ INTA

CLR 1FH ;尾数为零,阶码也清零,结束取整

MOV R2,#41H

RET

INTA: MOV A,R2

JZ INTB ;阶码为零否?

JB ACC.7,INTB;阶符为负否?

CLR C

SUBB A,#10H ;阶码小于16否?

JC INTD

RET ;阶码大于16,已经是整数

INTB: CLR A ;绝对值小于一,取整后正数为零,负数为负一

MOV R4,A

MOV C,1FH

RRC A

MOV R3,A

RL A

MOV R2,A

JNZ INTC

MOV R2,#41H

INTC: RET

INTD: CLR F0 ;舍尾标志初始化

INTE: CLR C

LCALL RR1 ;右规一次

ORL C,F0 ;记忆舍尾情况

MOV F0,C

CJNE R2,#10H,INTE;阶码达到16(尾数完全为整数)否?

JNB F0,INTF ;舍去部分为零否?

JNB 1FH,INTF;操作数为正数否?

INC R4 ;对于带小数的负数,向下取整

MOV A,R4

JNZ INTF

INC R3

INTF: LJMP RLN ;将结果规格化



(15) 标号: FRCP 功能:浮点倒数函数



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

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

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

FRCP: MOV A,@R0

MOV C,ACC.7

MOV 1FH,C ;保存数符

MOV C,ACC.6 ;绝对值传送到第二工作区

MOV ACC.7,C

MOV R5,A

INC R0

MOV A,@R0

MOV R6,A

INC R0

MOV A,@R0

MOV R7,A

DEC R0

DEC R0

ORL A,R6

JNZ RCP

SETB OV ;零不能求倒数,设立溢出标志

RET

RCP: MOV A,R6

JB ACC.7,RCP2;操作数格式化否?

CLR C ;格式化之

MOV A,R7

RLC A

MOV R7,A

MOV A,R6

RLC A

MOV R6,A

DEC R5

SJMP RCP

RCP2: MOV R2,#1 ;将数值1.00传送到第一工作区

MOV R3,#80H

MOV R4,#0

LCALL DIV3 ;调用工作区浮点除法,求得倒数

LJMP MOV0 ;回传结果



(16) 标号: FSQU 功能:浮点数平方



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

出口信息:OV=0时,平方值仍然在[R0]中,OV=1时溢出。

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

FSQU: MOV A,R0 ;将操作数

XCH A,R1 ;同时作为乘数

PUSH ACC ;保存R1指针

LCALL FMUL ;进行乘法运算

POP ACC

MOV R1,A ;恢复R1指针

RET
返回列表