📄 avr32fp.inc.asm
字号:
ADC R18,R23
RET
ADD32F_14: ;尾数相减
SUB R16,R21
SBC R17,R22
SBC R18,R23
RET
ADD32F_15: ;结果取补
COM R17
COM R18
NEG R16
SBCI R17,$FF
SBCI R18,$FF
RET
ADD32F_16: ;两个数相交换
ST -Y,R21
ST -Y,R22
ST -Y,R23
ST -Y,R24
ST -Y,R25
MOV R24,R19
MOV R21,R16
MOV R22,R17
MOV R23,R18
MOV R25,R20
LD R20,Y+
LD R19,Y+
LD R18,Y+
LD R17,Y+
LD R16,Y+
RET
YCL:
MOV R20,R19
LDI R26,$80
ADD R18,R18
ADC R19,R19 ; 将阶码移至R19
EOR R19,R26 ; 阶码减 $80 存于R19
ADD R26,R26
ROR R18 ; 恢复尾数最高位 1
ANDI R20,$80 ;取浮点数数符存于R20最高位
MOV R25,R24
LDI R26,$80
ADD R23,R23 ; 将阶码移至R24
ADC R24,R24
EOR R24,R26 ; 阶码减 $80 存于R24
ADD R26,R26
ROR R23 ; 恢复尾数最高位 1
ANDI R25,$80 ;取浮点数数符存于R25最高位
CPI R19,$80
RET
GGH: ;规格化
ADD R18,R18 ;隐含尾数最高位为 1
LDI R26,$80 ;考虑符号位
EOR R26,R19 ;右移R26,R18
ADD R20,R20
ROR R26
ROR R18
MOV R19,R26 ;R26移至R19
RET
DIV32F_1:
ST -Y,R26 ;转存R26
CLR R13 ;清R15:R14:R13
CLR R14
CLR R15
LDI R26,$18 ;令R26=$18(24)
DIV32F_2:
CP R16,R21 ;被除数(余数)与除数两尾数相比
CPC R17,R22
CPC R18,R23
BRCS DIV32F_3 ;被除数(余数) < 除数
SUB R16,R21 ;余数 = 被除数 - 除数
SBC R17,R22
SBC R18,R23
SEC
RJMP DIV32F_4
DIV32F_3:
CLC ; 清除进位位
DIV32F_4:
ADC R13,R13 ; 商左移一位,并加上进位位
ADC R14,R14
ADC R15,R15
ADD R16,R16 ; 余数左移一位
ADC R17,R17
ADC R18,R18
DEC R26 ; R26-1
BRNE DIV32F_2 ;循环 24 次
MOV R16,R13 ;取出商
MOV R17,R14
MOV R18,R15
LD R26,Y+ ;恢复R26
RET
DIV32F: ; 四字节浮点除法运算子程
AND R24,R24
BREQ DIV32F_7 ;跳至DIV32F_7,出结果
AND R19,R19 ;判被除数是否为 0
BREQ JGW0 ;为 0 ,则结果为 0
RCALL YCL ;调YCL子程
BREQ JGW0 ;跳至JGW0, 结果为 0
EOR R20,R25 ;取商的符号位存于R20
SEC
SBC R19,R24 ;取出商的阶码
BRVS JGZD ;溢出,跳至JGZD
LSR R23 ;无溢出
ROR R22 ;将被除数与除数得尾数
ROR R21 ;右移一位,最高位置 0
LSR R18
ROR R17
ROR R16
RCALL DIV32F_1 ;调DIV32F_1子程,进行运算
AND R18,R18 ;判R18最高位是否为 0
BRMI DIV32F_5 ;为 1
ADD R16,R16 ;为 0,左移被除数尾数
ADC R17,R17
ADC R18,R18
SUBI R19,$01 ;阶码减 1
BRVS JGZD ;溢出, 跳至JGZD
DIV32F_5: ;无溢出
MOV R26,R16
LSR R26
BRCS DIV32F_6 ;进位位为 1,跳至DIV32F_6
AND R16,R16
BRPL DIV32F_6 ;为正,跳至DIV32F_6
AND R17,R17
BRPL DIV32F_6 ;为正,跳至DIV32F_6
LDI R26,$01 ;尾数加 1
ADD R16,R26
CLR R26
ADC R17,R26
ADC R18,R26
DIV32F_6:
RJMP GGH
DIV32F_7:
RJMP JGW0
JGZD: ;结果置为 $7FFFFFFF
LDI R26,$7F
MOV R19,R26
OR R18,R26
LDI R26,$FF
MOV R16,R26
MOV R17,R26
RET
JGW0: ;结果置为 $00000000
CLR R16
CLR R17
CLR R18
CLR R19
CLR R20
RET
MPY32F: ; 四字节浮点乘法运算子程
RCALL YCL ; 调YCL子程 并判乘数是否为 0
BREQ JGW0 ; 被乘数为 0 ,跳至JGW0--结果为 0
CPI R24,$80 ;判乘数是否为 0
BREQ JGW0 ;乘数为 0 ,跳至JGW0--结果为 0
EOR R20,R25 ;符号位相异或
SEC
ADC R19,R24 ;恢复阶码,存于R19
BRVS JGZD ;溢出,跳至JGZD
RCALL MPY32F_2 ;无溢出,调MPY32F_2子程
AND R18,R18 ;判R18最高位是否为 1
BRMI MPY32F_1 ;为负,即R18最高位为1跳至MPY32F_1
DEC R19 ;为正,即R18最高位为 0 阶码减 1
ADD R15,R15 ;尾数左移一位
ADC R16,R16
ADC R17,R17
ADC R18,R18 ;直至R18最高位为 1 止
MPY32F_1:
SUBI R19,$FF ;阶码加 1
BRVS JGZD ;溢出,跳至JGZD
RJMP GGH ;跳至GGH--出结果
MPY32F_2:
ST -Y,R24 ;转存R24
CLR R13 ;清R26,R15,R14,R13
CLR R14
CLR R15
CLR R26
LDI R24,$18 ;令R24=$18(24)
MPY32F_3:
ADD R13,R13 ;积的尾数在R18:R17:R16:R15:R14:R13
ADC R14,R14
ADC R15,R15
ADC R16,R16 ;尾数左移
ADC R17,R17
ADC R18,R18
BRCC MPY32F_4 ;无进位,R24减 1 ,不加乘数
ADD R13,R21 ;有进位,R24减 1 ,加乘数到尾数低位
ADC R14,R22
ADC R15,R23
ADC R16,R26
ADC R17,R26
ADC R18,R26
MPY32F_4:
DEC R24 ;循环 24 次
BRNE MPY32F_3
LD R24,Y+ ;恢复R24
RET ;取高 24 位
QUBU: ;取补运算
COM R16
COM R17
COM R18
COM R19
SUBI R16,$FF
SBCI R17,$FF
SBCI R18,$FF
SBCI R19,$FF
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -