📄 计算.asm
字号:
;*****************单片机计算重力加速度g软件清单********************;
;总的公式为:2(S2*T1-S1*T2)/T1*T2(T1+T2)
ORG 0000H
LJMP MAIN ;主程序
MAIN: MOV SP,#70H ;设置堆栈
MOV R0,#20H ;清内存
CLR A
CLRS: MOV @R0,A
INC R0
CJNE R0,#80H,CLRS
MOV 33H,#00 ;T2
MOV 34H,#12H
MOV 35H,#39H
MOV 36H,#00H ;T1
MOV 37H,#20H
MOV 38H,#71H
MOV R0,#33H
LCALL BTOF
MOV R0,#36H
LCALL BTOF
MOV R3,#3
MOV R0,#33H ;计算T1*T2
MOV R1,#30H
LCALL SHIFT ;R0的内容转移到R1? MOV R0,#30H
MOV R1,#36H
LCALL FMUL ;浮点数乘法
MOV R0,#30H
;LCALL FTOB
MOV R1,#39H ;T1*T2乘积放在39H,3AH,3BH
MOV R3,#3
LCALL SHIFT
MOV R0,#33H ;计算T1+T2
MOV R1,#30H
MOV R3,#3
LCALL SHIFT
MOV R0,#30H
;LCALL BTOF
;MOV R0,#36H
;LCALL BTOF
MOV R0,#30H
MOV R1,#36H
LCALL FADD ;浮点数加法
MOV R0,#30H
MOV R1,#3CH
MOV R3,#3
LCALL SHIFT ;T1+T2和放在3CH,3DH,3EH
LCALL S1
;MOV R0,#36H
MOV R0,#45H
LCALL BTOF
MOV R0,#36H
MOV R1,#45H
LCALL FMUL
;LCALL FTOB
MOV R1,#30H
MOV R3,#3
LCALL SHIFT
MOV R0,#36H
MOV R1,#30H
LCALL FADD ;得到2*S2*T1在36H,37H,38H中
LCALL S1
MOV R0,#45H
LCALL BTOF
MOV R0,#33H
MOV R1,#45H
LCALL FMUL
MOV R1,#30H
MOV R3,#3
LCALL SHIFT
MOV R0,#33H
MOV R1,#30H
LCALL FADD ;得到2*S1*T2在33H,34H,35H中
;LCALL FTOB
MOV R0,#36H ;得到2(S2*T1-S1*T2)在36H,37H,38H中
MOV R1,#33H
LCALL FSUB
MOV R1,#39H
LCALL FDIV
MOV R1,#3CH
LCALL FDIV
LCALL FTOB ;得到最终结果BCD码在36H,37H,38H中
NOP
NOP
;MOV R3,#3
;MOV R0,#36H
;MOV R1,#49H ;从49H单元开始存储
;MOV A,R1
;ADD A,NUM3
;MOV R1,A
;LCALL SHIFT
;MOV A,NUM3 ;偏移量改变
;ADD A,#3
;MOV NUM3,A
;LCALL KEYIN
;RET
S1: MOV R0,#45H ;假设S1=S2=0.5米
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#50H
MOV @R0,A
INC R0
CLR A
MOV @R0,A
RET
SHIFT: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R3,SHIFT
RET ;得到最终结果BCD码在33H,34H,35H中
Z_THTL: MOV R0,#30H ;0.06553部分处理
MOV A,#7FH
MOV @R0,A
INC R0
MOV A,#65H
MOV @R0,A
INC R0
MOV A,#53H
MOV @R0,A
MOV R0,#30H
LCALL BTOF ;转换为二进制浮点操作数
RET
L_THTL: MOV R0,#45H ;需要除1000000处理
MOV A,#07H
MOV @R0,A
INC R0
MOV A,#10H
MOV @R0,A
INC R0
MOV A,#00H
MOV @R0,A
MOV R0,#30H
LCALL BTOF ;转换为二进制浮点操作数
RET
;(2) 标号; FADD 功能;浮点数加法
;入口条件;被加数在[R0]中,加数在[R1]中。
;出口信息;OV=0时,和仍在[R0]中,OV=1时,溢出。
;影响资源;PSW、A、B、R2~R7、位1EH、1FH 堆栈需求; 6字节
FADD: CLR F0 ;设立加法标志
SJMP AS ;计算代数和
;(3) 标号; FSUB 功能;浮点数减法
;入口条件;被减数在[R0]中,减数在[R1]中。
;出口信息;OV=0时,差仍在[R0]中,OV=1时,溢出。
;影响资源;PSW、A、B、R2~R7、位1EH、1FH 堆栈需求;6字节
FSUB: SETB F0 ;设立减法标志
AS: LCALL MVR1 ;计算代数和。先将[R1]传送到第二工作区
MOV C,F0 ;用加减标志来校正第二操作数的有效符号
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV 1EH,C ;将第二操作数的有效符号存入位1EH中
XRL A,@R0 ;与第一操作数的符号比较
RLC A
MOV F0,C ;保存比较结果
LCALL MVR0 ;将[R0]传送到第一工作区中
LCALL AS1 ;在工作寄存器中完成代数运算
MOV0: INC R0 ;将结果传回到[R0]中的子程序入口
INC R0
MOV A,R4 ;传回尾数的低字节
MOV @R0,A
DEC R0
MOV A,R3 ;传回尾数的高字节
MOV @R0,A
DEC R0
MOV A,R2 ;取结果的阶码
MOV C,1FH ;取结果的数符
MOV ACC.7,C ;拼入阶码中
MOV @R0,A
CLR ACC.7 ;不考虑数符
CLR OV ;清除溢出标志
CJNE A,#3FH,MV01 ;阶码是否上溢?
SETB OV ;设立溢出标志
MV01: MOV A,@R0 ;取出带数符的阶码
RET
MVR0: MOV A,@R0 ;将[R0]传送到第一工作区中的子程序
MOV C,ACC.7 ;将数符保存在位1FH中
MOV 1FH,C
MOV C,ACC.6 ;将阶码扩充为8bit补码
MOV ACC.7,C
MOV R2,A ;存放在R2中
INC R0
MOV A,@R0 ;将尾数高字节存放在R3中
MOV R3,A
INC R0
MOV A,@R0 ;将尾数低字节存放在R4中
MOV R4,A
DEC R0 ;恢复数据指针
DEC R0
RET
MVR1: MOV A,@R1 ;将[R1]传送到第二工作区中的子程序
MOV C,ACC.7 ;将数符保存在位1EH中
MOV 1EH,C
MOV C,ACC.6 ;将阶码扩充为8bit补码
MOV ACC.7,C
MOV R5,A ;存放在R5中
INC R1
MOV A,@R1 ;将尾数高字节存放在R6中
MOV R6,A
INC R1
MOV A,@R1 ;将尾数低字节存放在R7中
MOV R7,A
DEC R1 ;恢复数据指针
DEC R1
RET
AS1: MOV A,R6 ;读取第二操作数尾数高字节
ORL A,R7
JZ AS2 ;第二操作数为零,不必运算
MOV A,R3 ;读取第一操作数尾数高字节
ORL A,R4
JNZ EQ1
MOV A,R6 ;第一操作数为零,结果以第二操作数为准
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,1EH
MOV 1FH,C
AS2: RET
EQ1: MOV A,R2 ;对阶,比较两个操作数的阶码
XRL A,R5
JZ AS4 ;阶码相同,对阶结束
JB ACC.7,EQ3 ;阶符互异
MOV A,R2 ;阶符相同,比较大小
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C ;第二操作数右规一次
MOV A,R6 ;尾数缩小一半
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5 ;阶码加一
ORL A,R6 ;尾数为零否?
JNZ EQ1 ;尾数不为零,继续对阶
MOV A,R2 ;尾数为零,提前结束对阶
MOV R5,A
SJMP AS4
EQ3: MOV A,R2 ;判断第一操作数阶符
JNB ACC.7,EQ2 ;如为正,右规第二操作数
EQ4: CLR C
LCALL RR1 ;第一操作数右规一次
ORL A,R3 ;尾数为零否?
JNZ EQ1 ;不为零,继续对阶
MOV A,R5 ;尾数为零,提前结束对阶
MOV R2,A
AS4: JB F0,AS5 ;尾数加减判断
MOV A,R4 ;尾数相加
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
LJMP RR1 ;有进位,右规一次
AS5: CLR C ;比较绝对值大小
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B ;第一尾数减第二尾数
MOV R3,A
LJMP RLN ;结果规格化
AS6: CPL 1FH ;结果的符号与第一操作数相反
CLR C ;结果的绝对值为第二尾数减第一尾数
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3 ;浮点数规格化
ORL A,R4 ;尾数为零否?
JNZ RLN1
MOV R2,#0C1H ;阶码取最小值
RET
RLN1: MOV A,R3
JB ACC.7,RLN2 ;尾数最高位为一否?
CLR C ;不为一,左规一次
LCALL RL1
SJMP RLN ;继续判断
RLN2: CLR OV ;规格化结束
RET
RL1: MOV A,R4 ;第一操作数左规一次
RLC A ;尾数扩大一倍
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2 ;阶码减一
CJNE R2,#0C0H,RL1E ;阶码下溢否?
CLR A
MOV R3,A ;阶码下溢,操作数以零计
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3 ;第一操作数右规一次
RRC A ;尾数缩小一半
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2 ;阶码加一
CLR OV ;清溢出标志
CJNE R2,#40H,RR1E ;阶码上溢否?
MOV R2,#3FH ;阶码溢出
SETB OV
RR1E: RET
;(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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -