打印

【非典】32 bits BIN2BCD "二百五”算法 (164 bytes 341 周期)

[复制链接]
楼主: dengm
手机看帖
扫描二维码
随时随地手机跟帖
21
oufuqiang| | 2009-5-1 18:32 | 只看该作者 回帖奖励 |倒序浏览

顶,牛人

使用特权

评论回复
22
cooperate| | 2009-5-1 22:48 | 只看该作者

好贴

使用特权

评论回复
23
dengm|  楼主 | 2009-5-2 00:20 | 只看该作者

200 bytes bin to BCD(十进数482位) 51 ASM 要693,351周期

200 bytes 的 0ffh,  51 ASM 要693,351周期

使用特权

评论回复
24
程疗匠人| | 2009-5-2 19:40 | 只看该作者

邓苗同志居然用到200byte的bin?

使用特权

评论回复
25
ljm810010| | 2009-5-2 21:18 | 只看该作者

天文数字呀,51可以征服宇宙了。

使用特权

评论回复
26
dengm|  楼主 | 2009-5-3 00:41 | 只看该作者

这是256bytes Ram 51的最高处理能力, 用了253bytes了

使用特权

评论回复
27
bjc125| | 2009-5-3 23:26 | 只看该作者

有点难看懂

使用特权

评论回复
28
bjc125| | 2009-5-5 09:23 | 只看该作者

250算法?好快呀

楼主能不能把算法描述详细点呀
看得不太懂
汇编基础太差了
呵呵

使用特权

评论回复
29
dengm|  楼主 | 2009-5-14 21:46 | 只看该作者

【非典】32 bits BIN2BCD "二百五”算法 (141 bytes 287 周期)

; 终于在 300 周期内完成
;【非典】32 bits BIN2BCD  "二百五”算法 (164 bytes 341 周期)
;  SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-14 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 141 bytes  周期: 287
      ;---------------------------------------------------- 
       ORG 000H
         AJMP START
         
       ORG 80H
START:
        ; 1234567890 = &h4996 02D2
        ; R7R6R5R4R3     R7R6 R5R4
        MOV R7, #049H
        MOV R6, #096H
        MOV R5, #002H
        MOV R4, #0D2H
;    SJMP L_TEST    
        MOV R7, #0FFH
        MOV R6, #0FFH
        MOV R5, #0FFH
        MOV R4, #0FFH
L_TEST:
                  ;  &hffffffff = 4,294,967,295
        ACALL  SUB_BIN2BCD32
L_STOP:        
        SJMP L_STOP ;$

  ORG 100H
SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-14 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 141 bytes  周期: 287
      ;---------------------------------------------------- 
      MOV B, R7
      ACALL S_DIV250 

      XCH A, R5       ; R7:00:00    *250
      XCH A, R6       ; 
      MOV R3, A       ; R3:00:00    *250
                      ;     B:R6:R4 *1           
      ACALL S_DIV250
      XCH A, R4       ; R7:R5:00    *250

      ACALL S_DIV250B  ; R7:R5:R4    *250
                       ; R3:R2:R6    *250
                       ;          B  *1     
      MOV A, R4 
      ADD A, R6
      XCH A, R5
      ADDC A, R2
      XCH A, R3
      ADDC A, R7  ; C:A:R3:R5 *250

      RRC A
      XCH A, R3

      ACALL S_999  ; R3:R5:R7 *500

      MOV R4, A ; R4 *100 BCD

      MOV A, B
      SWAP A
      ADD A, R6
      XCH A, R3  ; R3 * 1 BCD  B *100 BCD
      
      RRC A
      MOV B, A
      XCH A, R5
      RRC A
      MOV R6, A

      MOV A, R7
      RRC A       ; R3 *1BCD  R4*100 BCD   R3:R5:A *1000
      MOV R7, A   ; R5:R6:R7 *1000 R3*1BCD R4*100BCD
    
      ACALL S_DIV250  ;     
      XCH A, R7

      ACALL S_DIV250B  ; R5:R7 *250
                       ; R2:R6 *250

      MOV A, R7
      ADD A, R6
      XCH A, R5
      ADDC A, R2

      ACALL S_999  ; R5:R7 *500

      SWAP A
      ADD A, B
      XCH A, R5  ; R5 *10000 BCD
      RRC A
      MOV B, A
      XCH A, R7  
      RRC A     

      XCH A, R6
      SWAP A
      ADD A, R4
      MOV R4, A      
                     ; R7:R6 *1000*1000
      ACALL S_DIV250 ; R7 *250
                     ; R6 *250
                     ;   B*1
      MOV A, R7
      ADD A, R6
      ACALL S_999B

      XCH A, R7
      RRC A
      SWAP A
      ADD A, R7
      MOV R7, A

      MOV A, B
      SWAP A
      ADD A, R6
      MOV R6, A
      RET

S_999:
      RRC A
      XCH A, R5
S_999B:
      MOV R7, A
      RRC A
      XCH A, R7    ; R7 * 500

      ANL A, #3
      ADD A, #(L_DB25-$-3)
      MOVC A, @A+PC
      MOV R6, A

      MOV A, #10
      XCH A, B
      DIV AB
      ADD A, R6
      MOV R6, B
      MOV B, #10
      DIV AB ; B*10     
             ; A*100   B*10BCD R2*1
      RET
     
L_DB25:
     DB 0, 25, 50, 75
;-----------------------------------------
S_DIV250B:
      XCH A, R6       ; 
      MOV R2, A       ; R3:R2:00    *250
                      ;        B:R6 *1
S_DIV250:
      ; B:R6
      MOV A, #6
      MUL AB 
      ADD A, R6
      XCH A, B
      ADDC A, #0 ; A:B
      
      MOV R6, A
      ADD A, R6
      ADD A, R6
      RLC A
      ;----------------------
      ADD A, B
      JC LL1
        ADD A, #6
        JC LL2
          SUBB A, #6
          MOV B, A
          RET
LL1:
        ADD A, #6
        NOP
        NOP
LL2:
        INC R6
        MOV B, A
        RET

      END

使用特权

评论回复
30
ljm810010| | 2009-5-14 23:33 | 只看该作者

越来越精炼了,呵呵

不过还是不搞不懂二百五原理。

使用特权

评论回复
31
dengm|  楼主 | 2009-5-15 12:51 | 只看该作者

【非典】32 bits BIN2BCD"二百五”算法(132 bytes 275 周期)终极

;  SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-15 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 132 bytes  周期: 275
      ;---------------------------------------------------- 
       ORG 000H
         AJMP START
         
       ORG 80H
START:
        ; 1234567890 = &h4996 02D2
        ; R7R6R5R4R3     R7R6 R5R4
        MOV R7, #049H
        MOV R6, #096H
        MOV R5, #002H
        MOV R4, #0D2H
;    SJMP L_TEST    
        MOV R7, #0FFH
        MOV R6, #0FFH
        MOV R5, #0FFH
        MOV R4, #0FFH
L_TEST:
                  ;  &hffffffff = 4,294,967,295
        ACALL  SUB_BIN2BCD32
L_STOP:        
        SJMP L_STOP ;$

  ORG 100H
SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-15 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 132 bytes  周期: 275
      ;---------------------------------------------------- 
      MOV B, R7
      ACALL S_DIV250 

      XCH A, R5       ; R7:00:00    *250
      XCH A, R6       ; 
      MOV R3, A       ; R3:00:00    *250
                      ;     B:R6:R4 *1           
      ACALL S_DIV250
      XCH A, R4       ; R7:R5:00    *250

      ACALL S_DIV250B  ; R7:R5:R4    *250
                       ; R3:R2:R6    *250
                       ;          B  *1     
      MOV A, R4 
      ADD A, R6
      XCH A, R5
      ADDC A, R2
      XCH A, R3
      ADDC A, R7  ; C:A:R3:R5 *250

      RRC A
      XCH A, R3

      ACALL S_999  ; R3:R5:R7 *500
      
      MOV R4, A ; R4 *100 BCD
      MOV A, B
      SWAP A
      ADD A, R6
      XCH A, R3  ; R3 * 1 BCD  B *100 BCD

      RRC A
      MOV B, A
      XCH A, R5
      RRC A


      XCH A, R7
      RRC A
      XCH A, R7
      MOV R6, A
                ; R3 *1BCD  R4*100 BCD   R3:R5:A *1000
                ; R5:R6:R7 *1000 R3*1BCD R4*100BCD

      ACALL S_DIV250  ;     
      XCH A, R7

      ACALL S_DIV250B  ; R5:R7 *250
                       ; R2:R6 *250

      MOV A, R7
      ADD A, R6
      XCH A, R5
      ADDC A, R2

      ACALL S_999  ; R5:R7 *500

      SWAP A
      ADD A, B
      XCH A, R5  ; R5 *10000 BCD
      RRC A
      MOV B, A
      XCH A, R7  
      RRC A     

      XCH A, R6
      SWAP A
      ADD A, R4
      MOV R4, A      
                     ; R7:R6 *1000*1000
      ACALL S_DIV250 ; R7 *250
                     ; R6 *250
                     ;   B*1
      MOV A, R7
      ADD A, R6
      ACALL S_999B

      XCH A, R7
      RRC A
      SWAP A
      ADD A, R7
      MOV R7, A

      MOV A, B
      SWAP A
      ADD A, R6
      MOV R6, A
      RET

S_999:
      RRC A
      XCH A, R5
S_999B:
      MOV R7, A
      RRC A
      XCH A, R7    ; R7 * 500

      ANL A, #3
      ADD A, #(L_DB25-$-3)
      MOVC A, @A+PC
      MOV R6, A

      MOV A, #10
      XCH A, B
      DIV AB
      ADD A, R6
      MOV R6, B
      MOV B, #10
      DIV AB ; B*10     
             ; A*100   B*10BCD R2*1
      RET
     
L_DB25:
     DB 0, 25, 50, 75
;-----------------------------------------

S_DIV250B:
      XCH A, R6       ; 
      MOV R2, A       ; R3:R2:00    *250
                      ;        B:R6 *1
S_DIV250:
      ; B:R6
      MOV A, #6
      MUL AB 
      ADD A, R6
      XCH A, B
      ADDC A, #1 ; A:B
      
      MOV R6, A
      ADD A, R6
      ADD A, R6
      RLC A
      ;----------------------
      ADD A, B
      JNC $+4
        SJMP $+5
        SUBB A, #6
        DEC R6
     ;--------------
     MOV B, A
     RET
     END

使用特权

评论回复
32
dengm|  楼主 | 2009-5-15 16:24 | 只看该作者

250算法比标准算法 快 7.7 倍 (2105/275=7.65)

250算法比标准算法 快 7.7 倍   (2105/275=6.4) 

        250算法   标准算法  改进的标准算法
BYTES     132       35           49
CYS       275     2105          987
 
 

使用特权

评论回复
33
dengm|  楼主 | 2009-5-17 18:40 | 只看该作者

优化了: 1 周期, 1 byte

;  SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-15 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 131 bytes  周期: 274
      ;---------------------------------------------------- 
       ORG 000H
         AJMP START
         
       ORG 80H
START:
        ; 1234567890 = &h4996 02D2
        ; R7R6R5R4R3     R7R6 R5R4
        MOV R7, #049H
        MOV R6, #096H
        MOV R5, #002H
        MOV R4, #0D2H
;    SJMP L_TEST    
        MOV R7, #0FFH
        MOV R6, #0FFH
        MOV R5, #0FFH
        MOV R4, #0FFH
L_TEST:
                  ;  &hffffffff = 4,294,967,295
        ACALL  SUB_BIN2BCD32
L_STOP:        
        SJMP L_STOP ;$

  ORG 100H
SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-15 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 131 bytes  周期: 274
      ;---------------------------------------------------- 
      MOV B, R7
      ACALL S_DIV250 

      XCH A, R5       ; R7:00:00    *250

      ;XCH A, R6       ; 
      ;MOV R2, A       ; R2:00:00    *250
                      ;     B:R6:R4 *1           
      ACALL S_DIV250B
      XCH A, R4       ; R7:R5:00    *250
      XCH A, R6
      MOV R3, A
      ACALL S_DIV250   ; R7:R5:R4    *250
                       ; R2:R3:R6    *250
                       ;          B  *1     
      XCH A, R4
      ADD A, R6
      XCH A, R3
      ADDC A, R5

      XCH A, R7
      ADDC A, R2  ; C:A:R7:R3 *250
     
      RRC A
      XCH A, R7
      RRC A
      XCH A, R3

      ACALL S_999  ; R7:R3:R6 *500
 
      XCH A, R7  ; R7 *BCD*100
      RRC A
      MOV R4, A
      XCH A, B
      SWAP A
      ORL A, R2
      XCH A, R3  ; R3 *1 BCD
      RRC A
      XCH A, R6
      RRC A

      MOV R5, A  ; R4:R6:R5 *1000
      ACALL S_DIV250  ;     

      XCH A, R5

      ;XCH A, R6       ; R4:00  *250
      ;MOV R2, A       ; R2:00  *250
                   
      ACALL S_DIV250B ; R4:R5 *250
                      ; R2:R6 *250
                      ;     B *1
      MOV A, R5
      ADD A, R6
                            
      XCH A, R4
      ADDC A, R2
      
      RRC A
      XCH A, R4
                              
      ACALL S_999  ; R4:R6 *500

      SWAP A
      ADD A, B
      MOV R5, A
      MOV A, R2
      SWAP A
      ADD A, R7
      XCH A, R4
      
      RRC A
      MOV B, A
      XCH A, R6
      RRC A

;     XCH A, R6
;     MOV R2, A
                     ; R2:R6 *1000*1000
      ACALL S_DIV250B  ; R2 *250
                       ; R6 *250
                       ;   B*1
      MOV A, R2
      ADD A, R6

      ACALL S_999
      
      XCH A, B
      SWAP A
      ADD A, R2
      XCH A, R6
      RRC A
      SWAP A
      ADD A, B
      MOV R7, A 
      RET

S_999:
      MOV R6, A
      RRC A 
      XCH A, R6
    ;-----------------------
      ANL A, #3
      ADD A, #(L_DB25-$-3)
      MOVC A, @A+PC
      MOV R2, A

      MOV A, #10
      XCH A, B
      DIV AB
      ADD A, R2
      MOV R2, B
      MOV B, #10
      DIV AB ; B*10     
             ; A*100   B*10BCD R2*1

      RET

L_DB25:
     DB 0, 25, 50, 75
;-----------------------------------------
S_DIV250B:
      XCH A, R6       ; R4:00  *250
      MOV R2, A       ; R2:00  *250

S_DIV250:
      ; B:R6
      MOV A, #6
      MUL AB 
      ADD A, R6
      XCH A, B
      ADDC A, #1 ; A:B
      MOV R6, A
      ADD A, R6
      ADD A, R6
      RLC A

      ;----------------------
      ADD A, B
      JNC $+4
        SJMP $+5
        SUBB A, #6
        DEC R6
     ;--------------
     MOV B, A
     RET

     END

使用特权

评论回复
34
耕在此行| | 2009-5-17 19:12 | 只看该作者

本人对语言不感冒

只对算法感兴趣,可21IC的高手们却很喜欢写语言.却对算法的解释不重视.

使用特权

评论回复
35
bg6nw| | 2009-5-17 21:24 | 只看该作者

本人佩服的是

五体投地,四爪朝天
牛人!

使用特权

评论回复
36
dengm|  楼主 | 2009-5-27 15:24 | 只看该作者

32 bits 的BIN 到 BCD 换, 51 ASM 仅 272 周期

;  SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-27 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 133 bytes  周期: 272
      ;---------------------------------------------------- 
       ORG 000H
         AJMP START
         
       ORG 80H
START:
        ; 1234567890 = &h4996 02D2
        ; R7R6R5R4R3     R7R6 R5R4
        MOV R7, #049H
        MOV R6, #096H
        MOV R5, #002H
        MOV R4, #0D2H
;    SJMP L_TEST    
        MOV R7, #0FFH
        MOV R6, #0FFH
        MOV R5, #0FFH
        MOV R4, #0FFH
L_TEST:
                  ;  &hffffffff = 4,294,967,295
        ACALL  SUB_BIN2BCD32
L_STOP:        
        SJMP L_STOP ;$

  ORG 100H
SUB_BIN2BCD32:
      ;----------------------------------------------------
      ;  "二百五" 算法        DengMiao 2009-05-27 GuangZhou 
      ;  Input:   bin 32:    R7:R6:R5:R4 
      ;  Output:  Bcd   : R7:R6:R5:R4:R3
      ;  使用:  R2..R7, A, B, C,AC,OV      Stack:2 bytes
      ;         Code: 133 bytes  周期: 272
      ;---------------------------------------------------- 
      MOV B, R7
      ACALL S_DIV250 
      XCH A, R5
      ;XCH A, R6
      ;MOV R2, A        ; R7:00:00    *250
                       ; R2:00:00    *250
                       ;     B:R5:R4 *1           
      ACALL S_DIV250B
      XCH A, R4        ; R7:R5:00   *250
      XCH A, R6        ; R2:R3:00   *250
      MOV R3, A           
      ACALL S_DIV250   ; R7:R5:R4    *250
                       ; R2:R3:R6    *250
                       ;           B  *1     
      MOV A, R4
      ADD A, R6
      XCH A, R3
      ADDC A, R5
      XCH A, R7
      ADDC A, R2
      
      RRC A
      XCH A, R7
      RRC A
      XCH A, R3
;      RRC A
;      MOV R6, A
;      RLC A      
        
      ACALL S_999B  ; R7:R3:R6 *500

      XCH A, R7    ; R7 *BCD*100
      RRC A
      
      MOV R5, A 
      XCH A, B
      SWAP A
      ORL A, R2

      XCH A, R3  ; R3 *1 BCD
      RRC A
      XCH A, R6
      RRC A
;-----------------------------
      MOV R4, A  ; R5:R6:R4 *1000
      ACALL S_DIV250  ; 
      XCH A, R4
      ;XCH A, R6
      ;MOV R2, A            
      ACALL S_DIV250B  ; R5:R4  *250
                       ; R2:R6  *250
                       ;      B *1
      MOV A, R6
      ADD A, R4
      
      XCH A, R5
      ADDC A, R2 ; A:R5
      
      RRC A
      XCH A, R5
      RRC A
      MOV R4, A
      ;RLC A
      ACALL S_999C    ; R5:R4 *500

      SWAP A
      ADD A, B
      XCH A, R5      ; * 10000 BCD

      RRC A
      MOV B, A

      XCH A, R2
      SWAP A
      ORL A, R7
      XCH A, R4     ; *100 BCD
      RRC A
      MOV R6, A
                ;R2:R6 *1000*1000
      ACALL S_DIV250   ; R2 *250
                       ; R6 *250
                       ;   B*1
      MOV A, R2
      ADD A, R6
     
      ;RRC A
      ;MOV R6, A
      ;RLC A  
      ACALL S_999B
      XCH A, B
      SWAP A
      ADD A, R2
      XCH A, R6
      RRC A
      SWAP A
      ADD A, B
      MOV R7, A
      RET


S_999B:
      RRC A
      MOV R6, A
S_999C:
      RLC A      
S_999:
    ;-----------------------
      ANL A, #3
      ADD A, #(L_DB25-$-3)
      MOVC A, @A+PC
      MOV R2, A

      MOV A, #10
      XCH A, B
      DIV AB
      ADD A, R2
      MOV R2, B
      MOV B, #10
      DIV AB ; B*10     
             ; A*100   B*10BCD R6*1

      RET

L_DB25:
     DB 0, 25, 50, 75
;-----------------------------------------
S_DIV250B:
      XCH A, R6
      MOV R2, A

S_DIV250:
      ; B:R6
      MOV A, #6
      MUL AB 
      ADD A, R6
      XCH A, B
      ADDC A, #1 ; A:B
      MOV R6, A
      ADD A, R6
      ADD A, R6
      RLC A

      ;----------------------
      ADD A, B
      JNC $+4
        SJMP $+5
        SUBB A, #6
        DEC R6
     ;--------------
     MOV B, A
     RET

     END

使用特权

评论回复
37
ljm810010| | 2009-5-28 00:18 | 只看该作者

曲高和寡

使用特权

评论回复
38
prcxf| | 2009-5-29 09:18 | 只看该作者

佩服+支持

使用特权

评论回复
39
ayb_ice| | 2011-10-8 13:20 | 只看该作者
LZ
你的程序不知道测试过没有啊,结果错的,再快也没有用啊
输入1234567890结果正确
输入250结果错误,后面输入结果大排的错误

使用特权

评论回复
40
hotpower| | 2011-10-8 15:13 | 只看该作者
估计早忘了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则