打印

半夜**叫---不明白~~~

[复制链接]
2989|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengm|  楼主 | 2007-5-8 23:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CRC, hd, AC, ov, pc
CRC_8:
      ;INPUT: R0: RAM DATA
      ;       R7: BYTES
      ;OUTPUT: A
      ;USE: A, R0, R7

     CLR A
CRC_8_1:
      XRL A, @R0
      INC R0
      CALL CRC8_TAB
    DJNZ R7, CRC_8_1
    RET

CRC8_TAB:
      XRL A, #57
      MOVC A, @A+PC
      RET    ; RET 的机器码 为 0x22
      ;DB 022H  RET 
      DB       07CH, 09EH, 0C0H, 043H, 01DH, 0FFH, 0A1H
      DB 0E0H, 0BEH, 05CH, 002H, 081H, 0DFH, 03DH, 063H
      DB 0BFH, 0E1H, 003H, 05DH, 0DEH, 080H, 062H, 03CH
      DB 07DH, 023H, 0C1H, 09FH, 01CH, 042H, 0A0H, 0FEH
      DB 001H, 05FH, 0BDH, 0E3H, 060H, 03EH, 0DCH, 082H
      DB 0C3H, 09DH, 07FH, 021H, 0A2H, 0FCH, 01EH, 040H
      DB 09CH, 0C2H, 020H, 07EH, 0FDH, 0A3H, 041H, 01FH
      DB 05EH, 000H, 0E2H, 0BCH, 03FH, 061H, 083H, 0DDH
      DB 064H, 03AH, 0D8H, 086H, 005H, 05BH, 0B9H, 0E7H
      DB 0A6H, 0F8H, 01AH, 044H, 0C7H, 099H, 07BH, 025H
      DB 0F9H, 0A7H, 045H, 01BH, 098H, 0C6H, 024H, 07AH
      DB 03BH, 065H, 087H, 0D9H, 05AH, 004H, 0E6H, 0B8H
      DB 047H, 019H, 0FBH, 0A5H, 026H, 078H, 09AH, 0C4H
      DB 085H, 0DBH, 039H, 067H, 0E4H, 0BAH, 058H, 006H
      DB 0DAH, 084H, 066H, 038H, 0BBH, 0E5H, 007H, 059H
      DB 018H, 046H, 0A4H, 0FAH, 079H, 027H, 0C5H, 09BH
      DB 0AEH, 0F0H, 012H, 04CH, 0CFH, 091H, 073H, 02DH
      DB 06CH, 032H, 0D0H, 08EH, 00DH, 053H, 0B1H, 0EFH
      DB 033H, 06DH, 08FH, 0D1H, 052H, 00CH, 0EEH, 0B0H
      DB 0F1H, 0AFH, 04DH, 013H, 090H, 0CEH, 02CH, 072H
      DB 08DH, 0D3H, 031H, 06FH, 0ECH, 0B2H, 050H, 00EH
      DB 04FH, 011H, 0F3H, 0ADH, 02EH, 070H, 092H, 0CCH
      DB 010H, 04EH, 0ACH, 0F2H, 071H, 02FH, 0CDH, 093H
      DB 0D2H, 08CH, 06EH, 030H, 0B3H, 0EDH, 00FH, 051H
      DB 0E8H, 0B6H, 054H, 00AH, 089H, 0D7H, 035H, 06BH
      DB 02AH, 074H, 096H, 0C8H, 04BH, 015H, 0F7H, 0A9H
      DB 075H, 02BH, 0C9H, 097H, 014H, 04AH, 0A8H, 0F6H
      DB 0B7H, 0E9H, 00BH, 055H, 0D6H, 088H, 06AH, 034H
      DB 0CBH, 095H, 077H, 029H, 0AAH, 0F4H, 016H, 048H
      DB 009H, 057H, 0B5H, 0EBH, 068H, 036H, 0D4H, 08AH
      DB 056H, 008H, 0EAH, 0B4H, 037H, 069H, 08BH, 0D5H
      DB 094H, 0CAH, 028H, 076H, 0F5H, 0ABH, 049H, 017H
;-------------------------------------------------------
标准法慢 1 个周期!
CRC8_TAB:
      JZ $ + 3
        MOVC A, @A+PC
      RET 
      ;DB 000H
      DB      0XXH, .....

相关帖子

沙发
xwj| | 2007-5-9 08:37 | 只看该作者

为什么要用CALL???

CRC_8:
      ;INPUT: R0: RAM DATA
      ;       R7: BYTES
      ;OUTPUT: A
      ;USE: A, R0, R7, DPTR

     MOV DPTR,#CRC8_TAB
     CLR A
CRC_8_1:
      XRL A, @R0
      INC R0
      MOVC    A,@A+DPTR
     DJNZ R7, CRC_8_1
     RET

CRC8_TAB:
      DB 000H, 07CH, 09EH, 0C0H, 043H, 01DH, 0FFH, 0A1H
      DB 0E0H, 0BEH, 05CH, 002H, 081H, 0DFH, 03DH, 063H
      DB 0BFH, 0E1H, 003H, 05DH, 0DEH, 080H, 062H, 03CH
      DB 07DH, 023H, 0C1H, 09FH, 01CH, 042H, 0A0H, 0FEH
      DB 001H, 05FH, 0BDH, 0E3H, 060H, 03EH, 0DCH, 082H
      DB 0C3H, 09DH, 07FH, 021H, 0A2H, 0FCH, 01EH, 040H
      DB 09CH, 0C2H, 020H, 07EH, 0FDH, 0A3H, 041H, 01FH
      DB 05EH, 000H, 0E2H, 0BCH, 03FH, 061H, 083H, 0DDH
      DB 064H, 03AH, 0D8H, 086H, 005H, 05BH, 0B9H, 0E7H
      DB 0A6H, 0F8H, 01AH, 044H, 0C7H, 099H, 07BH, 025H
      DB 0F9H, 0A7H, 045H, 01BH, 098H, 0C6H, 024H, 07AH
      DB 03BH, 065H, 087H, 0D9H, 05AH, 004H, 0E6H, 0B8H
      DB 047H, 019H, 0FBH, 0A5H, 026H, 078H, 09AH, 0C4H
      DB 085H, 0DBH, 039H, 067H, 0E4H, 0BAH, 058H, 006H
      DB 0DAH, 084H, 066H, 038H, 0BBH, 0E5H, 007H, 059H
      DB 018H, 046H, 0A4H, 0FAH, 079H, 027H, 0C5H, 09BH
      DB 0AEH, 0F0H, 012H, 04CH, 0CFH, 091H, 073H, 02DH
      DB 06CH, 032H, 0D0H, 08EH, 00DH, 053H, 0B1H, 0EFH
      DB 033H, 06DH, 08FH, 0D1H, 052H, 00CH, 0EEH, 0B0H
      DB 0F1H, 0AFH, 04DH, 013H, 090H, 0CEH, 02CH, 072H
      DB 08DH, 0D3H, 031H, 06FH, 0ECH, 0B2H, 050H, 00EH
      DB 04FH, 011H, 0F3H, 0ADH, 02EH, 070H, 092H, 0CCH
      DB 010H, 04EH, 0ACH, 0F2H, 071H, 02FH, 0CDH, 093H
      DB 0D2H, 08CH, 06EH, 030H, 0B3H, 0EDH, 00FH, 051H
      DB 0E8H, 0B6H, 054H, 00AH, 089H, 0D7H, 035H, 06BH
      DB 02AH, 074H, 096H, 0C8H, 04BH, 015H, 0F7H, 0A9H
      DB 075H, 02BH, 0C9H, 097H, 014H, 04AH, 0A8H, 0F6H
      DB 0B7H, 0E9H, 00BH, 055H, 0D6H, 088H, 06AH, 034H
      DB 0CBH, 095H, 077H, 029H, 0AAH, 0F4H, 016H, 048H
      DB 009H, 057H, 0B5H, 0EBH, 068H, 036H, 0D4H, 08AH
      DB 056H, 008H, 0EAH, 0B4H, 037H, 069H, 08BH, 0D5H
      DB 094H, 0CAH, 028H, 076H, 0F5H, 0ABH, 049H, 017H




;本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本请联系xuwenjun@21cn.com

使用特权

评论回复
板凳
dengm|  楼主 | 2007-5-9 17:19 | 只看该作者

因为DPTR 是重要东东,不能轻易使用

使用特权

评论回复
地板
xwj| | 2007-5-9 18:26 | 只看该作者

要保护DPTR先压栈即可,整体上也还是快很多啊

不要说堆栈也“是重要东东,不能轻易使用”哦,
因为子程序也要占用2个字节的堆栈

使用特权

评论回复
5
dengm|  楼主 | 2007-5-10 00:02 | 只看该作者

re:xwj 在uart中断中时每次只能处理1byte

    CALL CRC8_TAB   ; 2


CRC8_TAB:
      XRL A, #57    ; 1
      MOVC A, @A+PC ; 2
      RET           ; 2
;-------------------------
           2+1+2+2 =  7 周期

;==================================
    PUSH  DPL            ; 2
    PUSH  DPH            ; 2
    MOV DPTR, #CRC8_TAB  ; 2
    MOVC A, @A+DPTR      ; 2
    POP DPH              ; 2
    POP DPL              ; 2
;---------------------------
                   =      12 周期



              

使用特权

评论回复
6
hotpower| | 2007-5-10 02:38 | 只看该作者

半夜**叫---不明白~~~

使用特权

评论回复
7
lenglx| | 2007-5-10 13:28 | 只看该作者

to 5楼

to  :dengm  
re:xwj   在uart中断中时每次只能处理1byte <= 什么意思,在中断中调用CRC_8?

    CALL CRC8_TAB   ; 2


CRC8_TAB:
      XRL A, #57    ; 1
      MOVC A, @A+PC ; 2
      RET           ; 2
;-------------------------
           2+1+2+2 =  7 周期 <= 同意你的7个周期

;==================================
    PUSH  DPL            ; 2 <= 为什么要PUSH/POP
    PUSH  DPH            ; 2
    MOV DPTR, #CRC8_TAB  ; 2
    MOVC A, @A+DPTR      ; 2
    POP DPH              ; 2
    POP DPL              ; 2
;---------------------------
                   =      12 周期
 
如果在中断中调用CRC_8,需要保护DPTR,那也只要在中断进入/退出时处理一次就好.
如果是普通的调用,根本不需要保护.即使要保护,也只要在函数进入/退出时处理一次而已.
或者你所说:" 在uart中断中时每次只能处理1byte "的意思是:接收/发送一个byte,就计算一次CRC?这样每次都需要保护DPTR的开销?
我不认为这样的做法很好.
如果是接收,在接收完所有数据(包括CRC)后,再计算CRC是否正确,完全不耽误世界.
如果是发送,预先计算好CRC,难道不可以?

使用特权

评论回复
8
szpyt| | 2007-5-10 20:29 | 只看该作者

搞不懂!

不要搞太多自己不明白的东东,CRC的标准程序都用了几千年了,快一个周期有啥用?现在的CPU都很快了。

使用特权

评论回复
9
Airwill| | 2007-5-11 07:58 | 只看该作者

to:楼上

哪里有"几千年", 最多"几百个月"罢了.

太夸张了吧!

使用特权

评论回复
10
yewuyi| | 2007-5-11 08:35 | 只看该作者

‘XRL A, #57’干什么的?

呵呵,没看明白。


还是2楼的程序更简单明了……

使用特权

评论回复
11
dengm|  楼主 | 2007-5-11 08:42 | 只看该作者

2楼的表,仅第一个byte是对的!!

标准表的第(57+1)=58个byte为 22h -- RET的机器码为 22h

使用特权

评论回复
12
xwj| | 2007-5-11 08:45 | 只看该作者

呵呵,照抄的你的,抄错勿怪哦

要用的话 自己去根据多项式、移位方式自己生成表格啊

使用特权

评论回复
13
dengm|  楼主 | 2007-5-11 08:48 | 只看该作者

re: yewuyi

 标准表的第(57+1)=58个byte为 22h ( RET的机器码为 22h)

使用特权

评论回复
14
HotPower| | 2007-5-12 10:51 | 只看该作者

现在想通了~~~一般不为此伤脑筋~~~

使用特权

评论回复
15
平常人| | 2007-5-13 14:19 | 只看该作者

谢谢! 请问SD卡的5位CRC也应该可以用这个方法了?

使用特权

评论回复
16
dengm|  楼主 | 2007-5-13 16:53 | 只看该作者

“非典”算法都是“伤脑筋”的结果!

使用特权

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

本版积分规则

5

主题

823

帖子

0

粉丝