⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avr32fp.inc.asm

📁 单片机开发资料光盘-双龙-686M.zip
💻 ASM
📖 第 1 页 / 共 2 页
字号:
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 + -