打印

【非典】16 bits to packed BCD, 51 ASM. 61周期/80字节

[复制链接]
5077|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengm|  楼主 | 2007-4-2 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
BCD, ck, AC, ov, vr
  TEST_NUM  EQU 65432
  ORG 000H
    MOV R2, #LOW(TEST_NUM) ; #11111111B 
    MOV R3, #HIGH(TEST_NUM); #11111111B ; 65535
    CALL BIN2BCD
    SJMP $

;==============================
BIN2BCD:
    ;--------------------------------------*
    ;Input:  R3:R2 --- 16 bits bin         |
    ;                R2--Bit 0 to bit 7    |
    ;                R3--Bit 8 to bit 15   |
    ;Output: R7:R6:R5 --- 5 Dig Packed BCD |
    ;                     R5: 个位/十位    |
    ;                     R6: 百位/千位    |
    ;                     R7: 万位         |
    ;Usage:  PSW (C, AC, OV), Acc, B       |
    ;                                      |
    ;PS: 61 CYs only.  78 bytes            |
    ;           DengMiao  2007-4 Guangzhou |
    ;--------------------------------------*
    
    MOV A, R3    
    RRC A
    MOV B, A
    MOV A, R2
    RRC A
    MOV C, B.0
    RRC A
    XCH A, B
    RR A
    ANL A, #00111111B
    MOV R5, A
    RL A
    ADD A, R5
    XCH A, B
;------------------------------
    ADD A, B
    JC BIN2BCD_L1
      SJMP BIN2BCD_L2
BIN2BCD_L1:
      INC R5
      ADD A, #6
BIN2BCD_L2:
    ADD A, B
    JC BIN2BCD_L1B
      SJMP BIN2BCD_L2B
BIN2BCD_L1B:
      INC R5
      ADD A, #6
BIN2BCD_L2B:
    MOV B, #25
    DIV AB
    CJNE A, #10, BIN2BCD_L3
      INC R5
      CLR A
BIN2BCD_L3B:
    MOV R7, A  ; *100
    MOV A, R2
    ANL A, #00000011B
    MOV R6, A
    MOV A, #10
    XCH A, B
    RL A
    RL A
    ORL A, R6
    DIV AB
    SWAP A
    ORL A, B
    XCH A, R5
    MOV B, #10
    DIV AB
    XCH A, R7
    SWAP A
    ORL A, B
    SWAP A
    MOV R6, A
    RET
BIN2BCD_L3:
    SJMP BIN2BCD_L3B
;----------END OF BIN2BCD-------

  END

相关帖子

来自 2楼
dengm|  楼主 | 2007-4-20 08:36 | 只看该作者

re:

使用特权

评论回复
板凳
airwill| | 2007-4-2 21:54 | 只看该作者

哇, 够精练哪! 佩服

使用特权

评论回复
地板
dengm|  楼主 | 2007-4-3 02:41 | 只看该作者

算法说明:

把16bits, 分为3段:
     X -- Bit 10 到 Bit 15, 共 6 bits; (0 - 63)      *1024
     Y -- Bit 2 到 Bit 9,   共 8 bits; (0 - 255)     *4
     Z -- Bit 0 到 Bit 1,   共 2 bits; (0 - 3)       *1

可得到:
     1024 * X + 4 * Y + Z

   = 1000 * X + 24 * X + 4 * Y + Z

   = 1000 * X + 4 * ( 6 * X + Y ) + Z

   = 1000 * X + 4 * [ Y + (3*X) + (3*X)] + Z


  其中 X 的范围为 0 -- 63, 那么(3*X)的范围就为 0 -- 189, <255 (1 byte)
Y+(3*X) 如进位就 X 加1, [Y+(3*X)]-256 加 6, (因为 24 = 4 * 6).
另外, {[Y + (3*x)] - 256}+6 < 255 .

  = 1000 * (X+i) + 4 * {[Y + (3*x) + (3*x)] + 6 * i } + Z

  =   1000 * (X+i)
     + 100 * {[Y+3*X+3*X+6*i]  25 }
     + 4 * {[Y+3*X+3*X+6*i] MOD  25 }  + Z

其中   i          范围为    0 -- 2
     {[Y+3*X+3*X+6*i]  25 } <= 10
     4 * {[Y+3*X+3*X+6*i] MOD  25 }  + Z <= 99






     
  
  
    




 

使用特权

评论回复
5
dengm|  楼主 | 2007-4-3 03:13 | 只看该作者

速度优化:

      优化                       一般
    MOV A, R3                  MOV A, R3
    RRC A                      CLR C
                               RRC A
    MOV B, A                   MOV B, A
    MOV A, R2                  MOV A, R2
                               XCH A, B
    RRC A                      RRC A
    MOV C, B.0                 XCH A, B
                               CLR C
    RRC A                      RRC A
    XCH A, B                   XCH A, B
    RR A                       RRC A
    ANL A, #00111111B          XCH A, B
    MOV R5, A                  MOV R5, A 
    RL A                       RL A
    ADD A, R5                  ADD A, R5
    XCH A, B                   XCH A, B
;--------------------------------------

使用特权

评论回复
6
dengm|  楼主 | 2007-4-3 11:58 | 只看该作者

【非典】16 bits to packed BCD, 51 ASM. 61周期/73字节(注释)

  TEST_NUM  EQU 12345
  ORG 000H
    MOV R2, #LOW(TEST_NUM) ; #11111111B 
    MOV R3, #HIGH(TEST_NUM); #11111111B ; 65535
    CALL BIN2BCD
    SJMP $
;==================================
BIN2BCD:
    ;--------------------------------------*
    ;Input:  R3:R2 --- 16 bits bin         |
    ;                R2--Bit 0 to bit 7    |
    ;                R3--Bit 8 to bit 15   |
    ;Output: R7:R6:R5 --- 5 Dig Packed BCD |
    ;                     R5: 个位/十位    |
    ;                     R6: 百位/千位    |
    ;                     R7: 万位         |
    ;Usage:  PSW (C, AC, OV), Acc, B       |
    ;                                      |
    ;PS: 61 CYs only.  73 bytes            |
    ;           DengMiao  2007-4 Guangzhou |
    ;--------------------------------------*

    MOV A, R2
    ANL A, #00000011B
    MOV R6, A     ; R6 --- *1  (bit 0 to bit 1) (2 bits)    
    
    MOV A, R3
    RRC A
    MOV B, A
    MOV A, R2
    RRC A
    MOV C, B.0
    RRC A
    MOV R7, A    ; R7 --- *4  (bit 2 to bit 10) (8 bits)  

    MOV A, #25   ; 25 * 4 = 100
    XCH A, B
    RR A
    ANL A, #00111111B
    MOV R5, A    ; R5 --- *1024 (bit 11 to bit 15) (6 bits)
    RL A
    ADD A, R5
    XCH A, R7    ; R7 == 3 * R5   (<= 3*63=189 < 255)
                 ; A  --- *4
;------------------------------
    ADD A, R7    ; 4* (A + 3*R5)         
    JC BIN2BCD_L1
      SJMP BIN2BCD_L2
BIN2BCD_L1:
      INC R5     ; +1000
      ADD A, #6  ; +  24 (4*6)
BIN2BCD_L2:
    ADD A, R7   ;  4*(A + 3*R5 + 3*R5)= 4*A + 24*R5  
    JC BIN2BCD_L1B
      SJMP BIN2BCD_L2B
BIN2BCD_L1B:
      INC R5     ; +1000 
      ADD A, #6  ; +  24 (4*6)
BIN2BCD_L2B:
    ;MOV B, #25
    DIV AB       ; A  25 (4*25=100)   
    CJNE A, #10, BIN2BCD_L3  ; A<=25525=10
      INC R5     ; *1000
      CLR A
BIN2BCD_L3B:
    MOV R7, A    ; R7 --- *100  Bin/BCD  R7<=9 
                 ; B  --- *4    Bin      B <=24         
    MOV A, #10   
    XCH A, B     ; A  --- *4    Bin      B <=24         
    RL A         ; A*4
    RL A         ; A  --- *1    Bin      A <=4*24=96
    ORL A, R6    ; R6 --- *1    Bin/BCD  R6<=3 
                 ; A  --- *1    Bin      A<=96+3=99
    ;MOV B, #10
    DIV AB
    SWAP A
    ORL A, B
    XCH A, R5    ; R5 --- *1    BCD    个位/十位     
                 ; A  --- *1000 Bin    A<=65 
    MOV B, #10
    DIV AB
    XCH A, R7    ; R7 --- *10000 bin/BCD 万位 R7<=6
                 ; A  --- *100  Bin/BCD  A<=9
                 ; B  --- *1000 Bin/BCD  B<=9
    SWAP A       
    ORL A, B
    SWAP A
    MOV R6, A   ; R6  --- *100  BCD   百位/千位   
    RET
BIN2BCD_L3:
    SJMP BIN2BCD_L3B
;----------END OF BIN2BCD-------

  END
  

使用特权

评论回复
7
ayb_ice| | 2007-4-3 13:26 | 只看该作者

随便说说

  网上大把的...

使用特权

评论回复
8
dengm|  楼主 | 2007-4-3 17:11 | 只看该作者

LS: 网上大把?请给一个 100 周期以下的。。

使用特权

评论回复
9
xwj| | 2007-4-3 17:22 | 只看该作者

好小子,竟然敢质疑邓喵的汇编水平!

使用特权

评论回复
10
ayb_ice| | 2007-4-4 13:32 | 只看该作者

随便说说

  我是随便说说,不必生气.
  我认为只有CPU速度不能满足要求时,你的这些才会有意义,现实情况是现在的CPU很快(我在用C8051F系列,分频使用),更何况合理的整体程序结构比这更重要,比如再快的CPU,你调用软件延时程序...
  当然你的程序确实不错,向LZ道歉.

使用特权

评论回复
11
yewuyi| | 2007-4-4 15:47 | 只看该作者

呵呵,老邓快要走火入魔了……

不会是上次白沙题目的延续把?


怎么长时间还在考虑这?呵呵,小心成了‘欧阳峰’……

使用特权

评论回复
12
dengm|  楼主 | 2007-4-9 22:17 | 只看该作者

还能减6个左右周期, 也就是 10%, 但要20多字节的代价.

使用特权

评论回复
13
ayb_ice| | 2007-4-10 07:51 | 只看该作者

‘欧阳峰’

使用特权

评论回复
14
dengm|  楼主 | 2007-4-10 10:57 | 只看该作者

【非典】16 bits to packed BCD, 51 ASM. 55周期/93字节(终结)

  TEST_NUM  EQU 65535
  ORG 000H
    MOV R2, #LOW(TEST_NUM) ; #11111111B 
    MOV R3, #HIGH(TEST_NUM); #11111111B ; 65535
    CALL BIN2BCD
    SJMP $

;==================================
BIN2BCD:
    ;--------------------------------------*
    ;Input:  R3:R2 --- 16 bits bin         |
    ;                R2--Bit 0 to bit 7    |
    ;                R3--Bit 8 to bit 15   |
    ;Output: R7:R6:R5 --- 5 Dig Packed BCD |
    ;                     R5: 个位/十位    |
    ;                     R6: 百位/千位    |
    ;                     R7: 万位         |
    ;Usage:  PSW (C, AC, OV), Acc, B       |
    ;                                      |
    ;PS: 55 CYs only.  93 bytes            |
    ;           DengMiao  2007-4 Guangzhou |
    ;--------------------------------------*

    MOV A, R2
    ANL A, #00000011B
    MOV R6, A     ; R6 --- *1  (bit 0 to bit 1) (2 bits)    
    
    MOV A, R3
    RRC A
    MOV B, A
    MOV A, R2
    RRC A
    MOV C, B.0
    RRC A
    MOV R7, A    ; R7 --- *4  (bit 2 to bit 10) (8 bits)  

    MOV A, #25   ; 25 * 4 = 100
    XCH A, B
    RR A
    ANL A, #00111111B
    MOV R5, A    ; R5 --- *1024 (bit 11 to bit 15) (6 bits)
    RL A
    ADD A, R5
    XCH A, R7    ; R7 == 3 * R5   (<= 3*63=189 < 255)
                 ; A  --- *4
;------------------------------
    ADD A, R7    ; 4* (A + 3*R5)         
    JC BIN2BCD_L1
      SJMP BIN2BCD_L2
BIN2BCD_L1:
      INC R5     ; +1000
      ADD A, #6  ; +  24 (4*6)
BIN2BCD_L2:
    ADD A, R7   ;  4*(A + 3*R5 + 3*R5)= 4*A + 24*R5  
    JC BIN2BCD_L1B
      SJMP BIN2BCD_L2B
BIN2BCD_L1B:
      INC R5     ; +1000 
      ADD A, #6  ; +  24 (4*6)
BIN2BCD_L2B:
    ;MOV B, #25
    DIV AB       ; A  25 (4*25=100)   
    CJNE A, #10, BIN2BCD_L3  ; A<=25525=10
      INC R5     ; *1000
      CLR A
BIN2BCD_L3B:
    MOV R7, A    ; R7 --- *100  Bin/BCD  R7<=9 
                 ; B  --- *4    Bin      B <=24         
    MOV A, #10   
    XCH A, B     ; A  --- *4    Bin      B <=24         
  ;-------------
    ;RL A         ; A*4
    ;RL A         ; A  --- *1    Bin      A <=4*24=96
    ;ORL A, R6    ; R6 --- *1    Bin/BCD  R6<=3 
    ;             ; A  --- *1    Bin      A<=96+3=99
    ;DIV AB
    ;SWAP A
    ;ORL A, B
    ;XCH A, R5    ; R5 --- *1    BCD    个位/十位     
    ;             ; A  --- *1000 Bin    A<=65 
    ;MOV B, #10
    ;--------------  
     ADD A, #(BIN2BCD_DB - $ - 3)
     MOVC A, @A+PC
     ADD A, R6
     DA A
     XCH A, R5     ; R5 --- *1    BCD    个位/十位     
                   ; A  --- *1000 Bin    A<=65 
  ;--------------------------
    DIV AB
    XCH A, R7    ; R7 --- *10000 bin/BCD 万位 R7<=6
                 ; A  --- *100  Bin/BCD  A<=9
                 ; B  --- *1000 Bin/BCD  B<=9
    SWAP A       
    ORL A, B
    SWAP A
    MOV R6, A   ; R6  --- *100  BCD   百位/千位   
    RET
BIN2BCD_L3:
    SJMP BIN2BCD_L3B
BIN2BCD_DB:
    DB 00H, 04H, 08H, 12H, 16H
    DB 20H, 24H, 28H, 32H, 36H
    DB 40H, 44H, 48H, 52H, 56H
    DB 60H, 64H, 68H, 72H, 76H
    DB 80H, 84H, 88H, 92H, 96H

;----------END OF BIN2BCD-------

  END
  

使用特权

评论回复
15
dengm|  楼主 | 2007-4-10 11:05 | 只看该作者

精益求精的艺术品,希望大家喜欢。

使用特权

评论回复
16
zuoyou| | 2007-4-10 13:54 | 只看该作者

re

精益求精,pf

使用特权

评论回复
17
teddeng| | 2007-4-10 14:17 | 只看该作者

完全赞同楼主的思想

资源永远是稀缺的,思想才显得如此光辉。
只是觉得用错了地方,51资源的稀缺性越来越不重要了,因此楼主光辉的思想只剩下欣赏和训练的价值。
为什么不换个领域发挥?大有作为!

使用特权

评论回复
18
airwill| | 2007-4-11 19:46 | 只看该作者

呵呵, 真正是炉火纯青, 佩服

使用特权

评论回复
19
谈的元| | 2007-4-11 20:41 | 只看该作者

先收藏起,顶

要是用pic写的就更好了

使用特权

评论回复
20
diannaoza| | 2007-4-20 12:14 | 只看该作者

非典中的经典!

学习了,谢谢!

使用特权

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

本版积分规则

5

主题

823

帖子

0

粉丝