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

📄 emc_mult_div.c

📁 EMC 乘除法运算 (四节除以两节、四字街除以单字节、三字节除以两字节、适合于双字节除以双字节、双字节除以单字节、单字节除以单子节)
💻 C
字号:
;input-----a      单字节十六进制转成BCD
;output-----b0_bcdall
;translate hex to bcd.
hextobcd_trans:
		mov	b0_bcdall, a
		clr	b0_bcd
hextobcd_loop:
		mov	a, @10
		sub	a, b0_bcdall
		jbs	r3, _c
		jmp	hextobcd_out
		mov	b0_bcdall, a
		inc	b0_bcd
		jmp	hextobcd_loop
hextobcd_out:
		swapa	b0_bcd
		add	b0_bcdall, a
		ret	
    
sub_getbcdHL:     ;input:b0_bcdall    output:b0_bcdL,b0_bcdH
		mov	a, b0_bcdall
		and	a, @0x0f
		mov	b0_bcdL, a
		swapa b0_bcdall
		and	a, @0x0f
		mov	b0_bcdH, a    
		RET    
    

;(17) 标号: HB2 功能:双字节十六进制整数转换成双字节BCD码整数
;低地址存高位数据。
;;入口条件:待转换的双字节十六进制整数在R26、R27中。
;出口信息:转换后的三字节BCD码整数在R23、R24、R25中。
;影响资源:PSW、A、R22~R27 堆栈需求: 2字节
TwoByteHEXToBCD:     ;BANK1 R22~R27 
	BANK1
 CLRA; ;BCD码初始化
MOV b1_R23,A
MOV b1_R24,A
MOV b1_R25,A
MOVRK b1_R22,@10H; ;转换双字节十六进制整数   ;.........CH
HB3: MOV A,b1_R27; ;从高端移出待转换数的一位到CY中
MOV  r_backup,a
RLCA  r_backup
MOV b1_R27,A
MOV A,b1_R26
MOV  r_backup,a
RLCA  r_backup
MOV b1_R26,A
MOV A,b1_R25; ;BCD码带进位自身相加,相当于乘2
JBC STATUS,_C
INC b1_R25
ADD A,b1_R25
;ADDC A,b1_R25  ;.............CH
DAA ; ;十进制调整    ;............CH
MOV b1_R25,A
MOV A,b1_R24
JBC STATUS,_C
INC b1_R24
ADD A,b1_R24
;ADDC A,b1_R24
DAA    ;............CH
MOV b1_R24,A
MOV A,b1_R23
JBC STATUS,_C
INC b1_R23
ADD A,b1_R23
;ADDC A,b1_R23
MOV b1_R23,A ;;双字节十六进制数的万位数不超过6,不用调整
;DJNZ b1_R22,HB3 ;处理完16bit  ;..........CH
DJZ b1_R22
JMP HB3
RET

 mult_8bit:     ;只适用于单字节乘以单字节( 运算过程中乘机的高低位恰与计算结果的高低位反,故得到结果后从新存一次到指定的存贮。 
      BANK1         
     movrk b1_BitMult,@8
          clr b1_productl
          clr b1_producth
               loop8_mult:
           bc status,_c
          rrc b1_ActiveMult
          jbs status,_c
          jmp jmpproductshift
    ;  jp nc,jmpproductshift
      mov a,b1_PassMult
      add b1_productl,a
      jbc status,_c
      inc b1_producth
    ;  adc b1_producth,@0
              jmpproductshift:
          bc status,_c
          rrc b1_productl
     rrc b1_producth
          DEC b1_BitMult
          jbs status,_Z
          jmp loop8_mult 
      ; JP NZ,loop8_mult   
  ;   movrr b1_ProducthFinish,b1_productl
  ;    movrr b1_ProductlFinish,b1_producth
             ret  


 mult_24bit:     ;适用于双字节乘以单字节、单乘以单字节。 
     BANK1
 ;    movrk b1_ActiveMulth,@00h
  ;   movrk b1_ActiveMult,@0f0h
  ;   movrk b1_PassMult,@0ch
     movrk b1_BitMult,@25     
     clr b1_producth   
     clr b1_productm
     clr b1_productl    
            clr b1_Cstore                                   
 loop24_mult:  
           ;rcf  
        bc status,_C
        rrc b1_ActiveMulth
        rrc b1_ActiveMult    
     ;jp nc,jmpproductshift24
         JBS status,_C
         JMP jmpproductshift24
      ;     rcf
       bc status,_C
       bc status,_Z
    ; add r_product5,pass_mult2
      MOV A,b1_PassMult
      ADD b1_productl,A
    ; adc r_product4,pass_mult1
       JBS status,_C
       JMP   jmpproductshift24
        INC  b1_productm
        JBC STATUS,_Z
        INC b1_producth
 jmpproductshift24:
    ;  TM b1_Cstore,@00000001B
       
    ; JP NZ,jmpcset
    ;      rcf
    ;  jr jmp_rrcp_com
      JBC b1_Cstore,0
      JMP jmpcset
      BC STATUS,_C
      JMP jmp_rrcp_com
      
 jmpcset:
          ; scf
          bs status,_C
 jmp_rrcp_com:
        rrc b1_producth
         rrc b1_productm
       rrc b1_productl                 
     ;  jp c,jmporcstore
        JBC STATUS,_C
        JMP jmporcstore
       movrk b1_Cstore,@00h
     ;    jr jmpc_com
         JMP jmpc_com
  jmporcstore:
      movrk b1_Cstore,@01h
 jmpc_com:
        DJZ b1_BitMult
        JMP   loop24_mult    
            ret 

 mult_32bit:     ;适用于三字节乘以单字节,双字节乘以单字节、单乘以单字节。 
     BANK1
  ;   movrk b1_ActiveMulth,@00h
  ;   movrk b1_ActiveMultm,@00h
  ;   movrk b1_ActiveMult,@034h
  ;   movrk b1_PassMult,@0ch
     movrk b1_BitMult,@33     ;4*8
     clr b1_producth   
     clr b1_productmh
     clr b1_productml
     clr b1_productl    
            clr b1_Cstore                                   
 loop32_mult:  
           ;rcf  
        bc status,_C
        rrc b1_ActiveMulth
        rrc b1_ActiveMultm  
        rrc b1_ActiveMult   
     ;jp nc,jmpproductshift24
         JBS status,_C
         JMP jmpproductshift32
      ;     rcf
       bc status,_C
       bc status,_Z
    ; add r_product5,pass_mult2
      MOV A,b1_PassMult
      ADD b1_productl,A
    ; adc r_product4,pass_mult1
       JBS status,_C
       JMP   jmpproductshift32
        INC  b1_productml
        JBC STATUS,_Z
        INC b1_productmh
        JBC STATUS,_Z
        INC b1_producth        
 jmpproductshift32:
    ;  TM b1_Cstore,@00000001B
       
    ; JP NZ,jmpcset
    ;      rcf
    ;  jr jmp_rrcp_com
      JBC b1_Cstore,0
      JMP jmpcset32
      BC STATUS,_C
      JMP jmp_rrcp_com32
      
 jmpcset32:
          ; scf
          bs status,_C
 jmp_rrcp_com32:
        rrc b1_producth
         rrc b1_productmh
          rrc b1_productml
       rrc b1_productl                 
     ;  jp c,jmporcstore
        JBC STATUS,_C
        JMP jmporcstore32
       movrk b1_Cstore,@00h
     ;    jr jmpc_com
         JMP jmpc_com32
  jmporcstore32:
      movrk b1_Cstore,@01h
 jmpc_com32:
        DJZ b1_BitMult
        JMP   loop32_mult    
       
           ret      
           
     
 div_32bit:    ;(四节除以两节、四字街除以单字节、三字节除以两字节、适合于双字节除以双字节、双字节除以单字节、单字节除以单子节) 
 bank1
; MOVRK b1_ActiveDivh,@0fh   ; 出口: b1_quoutienth,r_quoutientm,b1_quoutientl,b1_remainderh,b1_remainderl
; MOVRK b1_ActiveDivmh,@00h
; MOVRK b1_ActiveDivml,@0f0h
; MOVRK b1_ActiveDivl,@0fh
; MOVRK b1_PassDivh,@30h
; MOVRK b1_PassDivl,@10h
 CLR b1_remainderh
 clr b1_remainderl
 CLR b1_quoutienth
 clr b1_quoutientmh
 clr b1_quoutientml
 clr b1_quoutientl
 MOVRK b1_BitDiv,@32
  ;MOV pass_div,@4
 ;MOV active_div,@36  ;;min   ;The number must decibe,can get r_remainder=5,r_quoutient=4.not @45h\\\\\\\\\\\\\\\\\
loop32:
 ;RCF 
 BC STATUS,_C
 RLC b1_quoutientl
 rlc b1_quoutientml
 rlc b1_quoutientmh
 rlc b1_quoutienth
 ;RCF 
  BC STATUS,_C
 RLC b1_remainderl
 rlc b1_remainderh
 ;RCF
  BC STATUS,_C
 RLC b1_ActiveDivl
 rlc b1_ActiveDivml
 rlc b1_ActiveDivmh
 rlc b1_ActiveDivh
 ;JP NC,mod_cmp_pass32
  JBS STATUS,_C
  JMP mod_cmp_pass32
 ORRK b1_remainderl,@01h
mod_cmp_pass32:
 ;cp b1_remainderh,b1_PassDivh
 ;jp c,finish_or32
 ;jp nz,jmpsub32
 ;CP b1_remainderl,b1_PassDivl
; JP C,finish_or32        ;C is 1,r_remainder<=pass_div
 
  movrr r_backup,b1_remainderh
  MOV A,b1_PassDivh
  sub a,r_backup  ;注:SUB A,R   和 SUB R,A  都是R-A,只是结果存放不同
  jbs status,_C
  JMP finish_or32 
  JBS status,_Z
  JMP jmpsub32
  MOVRR r_backup,b1_remainderl
  MOV A,b1_PassDivl
  SUB A,r_backup
  JBS STATUS,_C
  JMP finish_or32  
jmpsub32:
 ;rcf
  BC STATUS,_C
; SUB b1_remainderl,b1_PassDivl
 MOV A,b1_PassDivl
 SUB b1_remainderl,A
; sbc b1_remainderh,b1_PassDivh
 JBS STATUS,_C
 DEC b1_remainderh
 jmpsubhigh:
 MOV A,b1_PassDivh
 SUB b1_remainderh,A
 ORRK b1_quoutientl,@01h
finish_or32:
; DEC b1_BitDiv
 ;JP NZ,loop32
 DJZ b1_BitDiv
 JMP loop32
 RET             
         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -