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

📄 avr32fp.inc.asm

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