📄 avr32fp.inc.asm
字号:
INT2FP: ; 16位整数转换成四字节浮点数运算子程
CLR R18
SBRC R17,7 ; R17:R16为待转换的整数
COM R18
CLR R19 ; 16位整数按数符位扩展成32位长整数
SBRC R18,7 ; 为正,R19,R18清零
COM R19 ; 为负,R19,R18置为$FFFF
LONG2FP: ; 32位长整数转换成四字节浮点数运算子程
CLR R20 ; 清符号位R20
AND R19,R19 ; 先判+/-
BRPL LONG2FP_1 ; 为正,跳至LONG2FP_1
RCALL QUBU ; 为负,调QUBU子程--取补
COM R20 ; 符号位R20取反
LONG2FP_1:
MOV R26,R16 ; 再判R19:R18:R17:R16是否全零
OR R26,R17
OR R26,R18
OR R26,R19
BRNE LONG2FP_2 ; 不为零跳至LONG2FP_2
RJMP JGW0 ; 为零跳至JGW0-结果为零
LONG2FP_2:
LDI R26,$16 ; 令R26 = 22
RJMP LONG2FP_4
LONG2FP_3:
INC R26
LSR R19
ROR R18
ROR R17
ROR R16
LONG2FP_4:
AND R19,R19 ; 判高位是否为零
BRNE LONG2FP_3 ; 不为零,右移一位,阶码加 1
LONG2FP_5:
AND R18,R18 ; 判次高位是否为零
BRNE LONG2FP_7
SUBI R26,$08 ; 为零,阶码减 8
MOV R18,R17 ;数左移 8 位
MOV R17,R16
LDI R16,$00 ; 低位以 $00 填充
RJMP LONG2FP_5
LONG2FP_6:
DEC R26
ADD R16,R16
ADC R17,R17
ADC R18,R18
LONG2FP_7:
BRPL LONG2FP_6 ; R18第7为0,再左移一位
MOV R19,R26 ; 阶码减 1 ,直到R18第7为1
RJMP GGH
FP2INT: ; 四字节浮点数转换成16位整数运算子程
LDI R26,$0E ; 令R26 = 14
RJMP FP2LONG_1 ; 跳至FP2LONG_1
FP2LONG: ; 四字节浮点数转换成32位长整数运算子程
LDI R26,$1E ; 令R26 = 30
FP2LONG_1:
RCALL FP2LONG_11 ; 调FP2LONG_11子程
BREQ FP2LONG_4 ;相等,即阶码为 0 ,按 0 处理
SUB R26,R19 ;R26(14)-阶码差值
BREQ FP2LONG_2 ;为 0 ,则跳至FP2LONG_2
BRPL FP2LONG_5 ;为正, 则跳至FP2LONG_5-无溢出
FP2LONG_2: ;有溢出
AND R20,R20 ;符号为正,
BRMI FP2LONG_3 ;符号为负,则跳至FP2LONG_3
LDI R16,$FF
LDI R17,$FF
LDI R18,$FF
LDI R19,$7F
RET ;正向溢出,结果置为 $7F FF FF FF
FP2LONG_3:
LDI R16,$00
LDI R17,$00
LDI R18,$00
LDI R19,$80
RET ; 负向溢出,结果置为 $80 00 00 00
FP2LONG_4:
LDI R16,$00
LDI R17,$00
LDI R18,$00
LDI R19,$00
RET ;结果为 0 ,置为 $00 00 00 00
FP2LONG_5: ;无溢出
INC R19 ;阶码差值 + 1
BRMI FP2LONG_4 ;为负,即(阶码 < $7E)按零处理
LDI R19,$00 ;清R19
SUBI R26,$08 ;R26(14-阶码差值) -8
BRPL FP2LONG_7 ;为正转FP2LONG_7
SUBI R26,$F8 ;不够减则加 8
MOV R19,R18 ;左移 8 位
MOV R18,R17
MOV R17,R16
LDI R16,$7F ;低位以 $7F 填充
RJMP FP2LONG_8 ;跳至 FP2LONG_8
FP2LONG_6:
MOV R16,R17 ;右移 8 位
MOV R17,R18
LDI R18,$00 ;高位以 $00 填充
SUBI R26,$08 ;R26-8
FP2LONG_7:
CPI R26,$08 ;R26值与 8 相比较
BRCC FP2LONG_6 ;有借位,跳至FP2LONG_6
FP2LONG_8: ;无借位
AND R26,R26
BREQ FP2LONG_10
FP2LONG_9:
LSR R19 ;右移一位
ROR R18
ROR R17
ROR R16
DEC R26 ;R26-1,不为 0 跳至FP2LONG_9
BRNE FP2LONG_9 ;直到R26为 0 为止
FP2LONG_10: ;考虑符号位
SBRC R20,7
RJMP QUBU ;为负,则跳至QUBU-取补 返回
RET ;为正,返回
FP2LONG_11:
MOV R20,R19 ; 取浮点数数符存于R20最高位
ANDI R20,$80
ADD R18,R18 ; 将阶码移至R19
ADC R19,R19
SUBI R19,$80 ; 阶码减 $80 存于R19
SEC
ROR R18 ; 恢复尾数最高位 1
CPI R19,$80 ; 阶码差值与 $80 相比较
RET
ADD32F_1: ; 存储结果
MOV R20,R25
MOV R19,R24
MOV R18,R23
MOV R17,R22
MOV R16,R21
ADD32F_2:
RJMP GGH ; 跳至GGH--处理结果
SUB32F: ; 四字节浮点减法运算子程
SUBI R24,$80 ; 减数取反,视为浮点加法运算
ADD32F: ; 四字节浮点加法运算子程
RCALL YCL ; 调YCL子程
CPI R24,$80 ;先判加数是否为 0
BREQ ADD32F_2 ;为 0 则和为被加数 跳至ADD32F_2
CPI R19,$80 ;再判被加数是否为 0
BREQ ADD32F_1 ;为 0 则和为加数 跳至ADD32F_1
ADD32F_3:
MOV R26,R19 ;转存被加数阶码
SUB R26,R24 ;R26=被加数阶码 减 加数阶码
BRVS ADD32F_2 ;溢出,跳至ADD32F_2 即加数可忽略
BRMI ADD32F_4 ;为负,跳至ADD32F_4
BRNE ADD32F_5 ;不等,跳至ADD32F_5
CP R16,R21
CPC R17,R22
CPC R18,R23
BRCC ADD32F_5
ADD32F_4:
RCALL ADD32F_16 ;调ADD32F_16,被加数和加数相交换
RJMP ADD32F_3 ;跳至ADD32F_3
ADD32F_5:
CPI R26,$18 ;阶码差值与 24 相比较
BRCS ADD32F_6 ;C=1,跳至ADD32F_6,即 < 24
CLR R21 ; > 24 加数清 0
CLR R22
CLR R23
ADD32F_6:
CPI R26,$08 ;阶码差值与 8 相比较
BRCS ADD32F_7 ;C=1,跳至ADD32F_7 (直至 < 8)
MOV R21,R22 ;加数尾数右移 8 位
MOV R22,R23 ;高 8 位清 0
CLR R23
SUBI R26,$08 ;阶码差值再减 8
RJMP ADD32F_6 ;跳至ADD32F_6
ADD32F_7:
AND R26,R26
BREQ ADD32F_9 ;直至R26=0,跳至ADD32F_9
ADD32F_8:
LSR R23 ;加数尾数右移 1 位
ROR R22
ROR R21
DEC R26 ;阶码差值减 1
BRNE ADD32F_8 ;不为 0 跳至ADD32F_8
ADD32F_9:
MOV R26,R20 ;被加数和加数是否同号
EOR R26,R25
BRMI ADD32F_10 ;异号,跳至ADD32F_10
RCALL ADD32F_13 ;同号,调ADD32F_13子程--尾数相加
BRCC ADD32F_2 ;C=0,无溢出,跳至ADD32F_2
ROR R18 ;C=1,溢出,尾数右移 1 位
ROR R17
ROR R16
SUBI R19,$FF ;阶码加 1
BRVC ADD32F_2 ;无溢出,跳至ADD32F_2,处理结果
RJMP JGZD ;溢出,跳至JGZD ,出结果
ADD32F_10:
RCALL ADD32F_14 ;调ADD32F_14子程--尾数相减
BRNE ADD32F_11 ;不等,跳至ADD32F_11
RJMP JGW0 ;跳至JGW0 ,出结果
ADD32F_11:
BRCC ADD32F_12 ;C=0,够减,跳至ADD32F_12
RCALL ADD32F_15 ;C=1,不够减,调ADD32F_15子程--取补
ADD32F_12:
AND R18,R18 ;判R18最高位是否位 1
BRMI ADD32F_2 ;为 1 ,跳至ADD32F_2,处理结果
ADD R16,R16 ;为 0 ,尾数左移一位
ADC R17,R17
ADC R18,R18
SUBI R19,$01 ;阶码减 1
BRVC ADD32F_12 ;无溢出,跳至ADD32F_12
RJMP JGZD ;溢出,跳至JGZD ,出结果
ADD32F_13: ;尾数相加
ADD R16,R21
ADC R17,R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -