打印

CRC-8 -CCITT ASM 12 周期 149 字节

[复制链接]
5232|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dengm|  楼主 | 2011-8-29 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CRC, hd, ADDA, AD, ov
SUB_CRC8:  ;G(X)= X^8+X^5+X^4+1  LSB
    XCH A, CRC
    XRL A, CRC
    JBC ACC.7, L_CRC8_H
       ADD A, #(CRC8_DATA-$-3)
       MOVC A, @A+PC
       SJMP L_CRC8_EX     

L_CRC8_H:
      ADD A, #(CRC8_DATA-$-3)
      MOVC A, @A+PC
      XRL A, #8CH
      NOP
L_CRC8_EX:
      XCH A, CRC
      RET

CRC8_DATA:
     db 000h, 05eh, 0bch, 0e2h, 061h, 03fh, 0ddh, 083h
     db 0c2h, 09ch, 07eh, 020h, 0a3h, 0fdh, 01fh, 041h
     db 09dh, 0c3h, 021h, 07fh, 0fch, 0a2h, 040h, 01eh
     db 05fh, 001h, 0e3h, 0bdh, 03eh, 060h, 082h, 0dch
     db 023h, 07dh, 09fh, 0c1h, 042h, 01ch, 0feh, 0a0h
     db 0e1h, 0bfh, 05dh, 003h, 080h, 0deh, 03ch, 062h
     db 0beh, 0e0h, 002h, 05ch, 0dfh, 081h, 063h, 03dh
     db 07ch, 022h, 0c0h, 09eh, 01dh, 043h, 0a1h, 0ffh
     db 046h, 018h, 0fah, 0a4h, 027h, 079h, 09bh, 0c5h
     db 084h, 0dah, 038h, 066h, 0e5h, 0bbh, 059h, 007h
     db 0dbh, 085h, 067h, 039h, 0bah, 0e4h, 006h, 058h
     db 019h, 047h, 0a5h, 0fbh, 078h, 026h, 0c4h, 09ah
     db 065h, 03bh, 0d9h, 087h, 004h, 05ah, 0b8h, 0e6h
     db 0a7h, 0f9h, 01bh, 045h, 0c6h, 098h, 07ah, 024h
     db 0f8h, 0a6h, 044h, 01ah, 099h, 0c7h, 025h, 07bh
     db 03ah, 064h, 086h, 0d8h, 05bh, 005h, 0e7h, 0b9h

相关帖子

沙发
NE5532| | 2011-8-29 17:03 | 只看该作者
本帖最后由 NE5532 于 2011-8-29 17:10 编辑

楼主那个NOP是拿来做啥的呢?

使用特权

评论回复
板凳
yewuyi| | 2011-8-29 17:09 | 只看该作者
汇编狂人再现江湖。。。;P

好久不见灯苗。。。

使用特权

评论回复
地板
dengm|  楼主 | 2011-8-29 17:13 | 只看该作者
本帖最后由 dengm 于 2011-8-29 17:17 编辑

仅提取数据 261 bytes  6 周期
Get_CRC_DATA:
      JNZ $ + 2
        SJMP $+3
      MOVC A, @A+PC
      RET

CRC8_DATA:
     ;db 000h,
     DB       05eh, 0bch, 0e2h, 061h, 03fh, 0ddh, 083h
     db 0c2h, 09ch, 07eh, 020h, 0a3h, 0fdh, 01fh, 041h
     db 09dh, 0c3h, 021h, 07fh, 0fch, 0a2h, 040h, 01eh
     db 05fh, 001h, 0e3h, 0bdh, 03eh, 060h, 082h, 0dch
     db 023h, 07dh, 09fh, 0c1h, 042h, 01ch, 0feh, 0a0h
     db 0e1h, 0bfh, 05dh, 003h, 080h, 0deh, 03ch, 062h
     db 0beh, 0e0h, 002h, 05ch, 0dfh, 081h, 063h, 03dh
     db 07ch, 022h, 0c0h, 09eh, 01dh, 043h, 0a1h, 0ffh
     db 046h, 018h, 0fah, 0a4h, 027h, 079h, 09bh, 0c5h
     db 084h, 0dah, 038h, 066h, 0e5h, 0bbh, 059h, 007h
     db 0dbh, 085h, 067h, 039h, 0bah, 0e4h, 006h, 058h
     db 019h, 047h, 0a5h, 0fbh, 078h, 026h, 0c4h, 09ah
     db 065h, 03bh, 0d9h, 087h, 004h, 05ah, 0b8h, 0e6h
     db 0a7h, 0f9h, 01bh, 045h, 0c6h, 098h, 07ah, 024h
     db 0f8h, 0a6h, 044h, 01ah, 099h, 0c7h, 025h, 07bh
     db 03ah, 064h, 086h, 0d8h, 05bh, 005h, 0e7h, 0b9h
     
     db 08ch, 0d2h, 030h, 06eh, 0edh, 0b3h, 051h, 00fh
     db 04eh, 010h, 0f2h, 0ach, 02fh, 071h, 093h, 0cdh
     db 011h, 04fh, 0adh, 0f3h, 070h, 02eh, 0cch, 092h
     db 0d3h, 08dh, 06fh, 031h, 0b2h, 0ech, 00eh, 050h
     db 0afh, 0f1h, 013h, 04dh, 0ceh, 090h, 072h, 02ch
     db 06dh, 033h, 0d1h, 08fh, 00ch, 052h, 0b0h, 0eeh
     db 032h, 06ch, 08eh, 0d0h, 053h, 00dh, 0efh, 0b1h
     db 0f0h, 0aeh, 04ch, 012h, 091h, 0cfh, 02dh, 073h
     db 0cah, 094h, 076h, 028h, 0abh, 0f5h, 017h, 049h
     db 008h, 056h, 0b4h, 0eah, 069h, 037h, 0d5h, 08bh
     db 057h, 009h, 0ebh, 0b5h, 036h, 068h, 08ah, 0d4h
     db 095h, 0cbh, 029h, 077h, 0f4h, 0aah, 048h, 016h
     db 0e9h, 0b7h, 055h, 00bh, 088h, 0d6h, 034h, 06ah
     db 02bh, 075h, 097h, 0c9h, 04ah, 014h, 0f6h, 0a8h
     db 074h, 02ah, 0c8h, 096h, 015h, 04bh, 0a9h, 0f7h
     db 0b6h, 0e8h, 00ah, 054h, 0d7h, 089h, 06bh, 035h

使用特权

评论回复
5
听飞鸟说| | 2011-8-29 17:16 | 只看该作者
完全性看不懂

使用特权

评论回复
6
dengm|  楼主 | 2011-8-29 17:22 | 只看该作者
用DPTR也可以, 但在中断中要push dptr, pop dptr 要8个周期

使用特权

评论回复
7
dengm|  楼主 | 2011-8-29 17:33 | 只看该作者
仅提取数据 259 bytes  5 周期

Get_CRC8_DATA:
     ADD A, #(256 - 18)
     MOVC A, @A+DPTR
     RET    ; 机器码为 21H
CRC8_DATA:
                ;db 021h,
                       db 07fh, 0fch, 0a2h, 040h, 01eh
     db 05fh, 001h, 0e3h, 0bdh, 03eh, 060h, 082h, 0dch
     db 023h, 07dh, 09fh, 0c1h, 042h, 01ch, 0feh, 0a0h
     db 0e1h, 0bfh, 05dh, 003h, 080h, 0deh, 03ch, 062h
     db 0beh, 0e0h, 002h, 05ch, 0dfh, 081h, 063h, 03dh
     db 07ch, 022h, 0c0h, 09eh, 01dh, 043h, 0a1h, 0ffh
     db 046h, 018h, 0fah, 0a4h, 027h, 079h, 09bh, 0c5h
     db 084h, 0dah, 038h, 066h, 0e5h, 0bbh, 059h, 007h
     db 0dbh, 085h, 067h, 039h, 0bah, 0e4h, 006h, 058h
     db 019h, 047h, 0a5h, 0fbh, 078h, 026h, 0c4h, 09ah
     db 065h, 03bh, 0d9h, 087h, 004h, 05ah, 0b8h, 0e6h
     db 0a7h, 0f9h, 01bh, 045h, 0c6h, 098h, 07ah, 024h
     db 0f8h, 0a6h, 044h, 01ah, 099h, 0c7h, 025h, 07bh
     db 03ah, 064h, 086h, 0d8h, 05bh, 005h, 0e7h, 0b9h
     
     db 08ch, 0d2h, 030h, 06eh, 0edh, 0b3h, 051h, 00fh
     db 04eh, 010h, 0f2h, 0ach, 02fh, 071h, 093h, 0cdh
     db 011h, 04fh, 0adh, 0f3h, 070h, 02eh, 0cch, 092h
     db 0d3h, 08dh, 06fh, 031h, 0b2h, 0ech, 00eh, 050h
     db 0afh, 0f1h, 013h, 04dh, 0ceh, 090h, 072h, 02ch
     db 06dh, 033h, 0d1h, 08fh, 00ch, 052h, 0b0h, 0eeh
     db 032h, 06ch, 08eh, 0d0h, 053h, 00dh, 0efh, 0b1h
     db 0f0h, 0aeh, 04ch, 012h, 091h, 0cfh, 02dh, 073h
     db 0cah, 094h, 076h, 028h, 0abh, 0f5h, 017h, 049h
     db 008h, 056h, 0b4h, 0eah, 069h, 037h, 0d5h, 08bh
     db 057h, 009h, 0ebh, 0b5h, 036h, 068h, 08ah, 0d4h
     db 095h, 0cbh, 029h, 077h, 0f4h, 0aah, 048h, 016h
     db 0e9h, 0b7h, 055h, 00bh, 088h, 0d6h, 034h, 06ah
     db 02bh, 075h, 097h, 0c9h, 04ah, 014h, 0f6h, 0a8h
     db 074h, 02ah, 0c8h, 096h, 015h, 04bh, 0a9h, 0f7h
     db 0b6h, 0e8h, 00ah, 054h, 0d7h, 089h, 06bh, 035h

     db 000h, 05eh, 0bch, 0e2h, 061h, 03fh, 0ddh, 083h
     db 0c2h, 09ch, 07eh, 020h, 0a3h, 0fdh, 01fh, 041h
     db 09dh, 0c3h

使用特权

评论回复
8
dengm|  楼主 | 2011-8-29 17:38 | 只看该作者
re: NE5532
   NOP  耗时的,   最稳定的代码, 运行时用时应该不变!!!

使用特权

评论回复
9
dengm|  楼主 | 2011-8-29 17:44 | 只看该作者
在一般的通信, 我一般用 CRC8 + SUM8   16 bits

SUB_CRC8_SUM8:
     XCH A, SUM8
     ADD A, SUM8
     XCH  A, SUM8
SUB_CRC8:  ;G(X)= X^8+X^5+X^4+1  LSB
    XCH A, CRC
    XRL A, CRC
    JBC ACC.7, L_CRC8_H
       ADD A, #(CRC8_DATA-$-3)
       MOVC A, @A+PC
       SJMP L_CRC8_EX     

L_CRC8_H:
      ADD A, #(CRC8_DATA-$-3)
      MOVC A, @A+PC
      XRL A, #8CH
      NOP
L_CRC8_EX:
      XCH A, CRC
;.....
; .......
      RET
CRC8_DATA:
     db .....
    .......

使用特权

评论回复
10
NE5532| | 2011-8-29 19:23 | 只看该作者
木有道理,优秀的代码是做必要的事。

使用特权

评论回复
11
hotpower| | 2011-8-30 02:07 | 只看该作者
哈哈,邓苗归隐后是大大落后于菜农了~~~

玩具http://www.hotpage.net.cn/HotPower_HotAjax.html已很暴力~~~

暂且不说不查表的纯移位,就说查表吧,用大表要256个字节,小表只要16个字节。

下面是玩具自动生成的C语言代码(邓苗来了,俺生成51的汇编???):
//CRC位域4表(小端):
const unsigned char CRCR8_8C_Table[16] = {
  0x00,0x9D,0x23,0xBE,0x46,0xDB,0x65,0xF8,0x8C,0x11,0xAF,0x32,0xCA,0x57,0xE9,0x74
};
//CRC位域4查表算法(小端):
unsigned char GetCRCR8_8C_00_00_Table(unsigned char *crcBuff, unsigned char crcLen) {
unsigned char i;
unsigned char crc = 0x00;
unsigned char crcTemp;
  for(i = 0; i < (crcLen * 2); i ++) {
    if (i & 1) crcTemp = crcBuff[i >> 1] >> 4;
    else crcTemp = crcBuff[i >> 1] & 0x0F;
    crc = (crc >> 4) ^ CRCR8_8C_Table[(crc & 0x0F) ^ crcTemp];
  }
  return crc;
}
void main() {
const unsigned char dataTable[] = "\x01\x23\x45\x67\x89\xAB\xCD\xEF";
unsigned char crc;
  crc = GetCRCR8_8C_00_00_Table((unsigned char *)dataTable, sizeof(dataTable) - 1);
  while(1);
}

使用特权

评论回复
12
hotpower| | 2011-8-30 02:08 | 只看该作者
大表有些臃肿~~~
//CRC位域8表(小端):
const unsigned char CRCR8_8C_Table[256] = {
  0x00,0x5E,0xBC,0xE2,0x61,0x3F,0xDD,0x83,0xC2,0x9C,0x7E,0x20,0xA3,0xFD,0x1F,0x41,
  0x9D,0xC3,0x21,0x7F,0xFC,0xA2,0x40,0x1E,0x5F,0x01,0xE3,0xBD,0x3E,0x60,0x82,0xDC,
  0x23,0x7D,0x9F,0xC1,0x42,0x1C,0xFE,0xA0,0xE1,0xBF,0x5D,0x03,0x80,0xDE,0x3C,0x62,
  0xBE,0xE0,0x02,0x5C,0xDF,0x81,0x63,0x3D,0x7C,0x22,0xC0,0x9E,0x1D,0x43,0xA1,0xFF,
  0x46,0x18,0xFA,0xA4,0x27,0x79,0x9B,0xC5,0x84,0xDA,0x38,0x66,0xE5,0xBB,0x59,0x07,
  0xDB,0x85,0x67,0x39,0xBA,0xE4,0x06,0x58,0x19,0x47,0xA5,0xFB,0x78,0x26,0xC4,0x9A,
  0x65,0x3B,0xD9,0x87,0x04,0x5A,0xB8,0xE6,0xA7,0xF9,0x1B,0x45,0xC6,0x98,0x7A,0x24,
  0xF8,0xA6,0x44,0x1A,0x99,0xC7,0x25,0x7B,0x3A,0x64,0x86,0xD8,0x5B,0x05,0xE7,0xB9,
  0x8C,0xD2,0x30,0x6E,0xED,0xB3,0x51,0x0F,0x4E,0x10,0xF2,0xAC,0x2F,0x71,0x93,0xCD,
  0x11,0x4F,0xAD,0xF3,0x70,0x2E,0xCC,0x92,0xD3,0x8D,0x6F,0x31,0xB2,0xEC,0x0E,0x50,
  0xAF,0xF1,0x13,0x4D,0xCE,0x90,0x72,0x2C,0x6D,0x33,0xD1,0x8F,0x0C,0x52,0xB0,0xEE,
  0x32,0x6C,0x8E,0xD0,0x53,0x0D,0xEF,0xB1,0xF0,0xAE,0x4C,0x12,0x91,0xCF,0x2D,0x73,
  0xCA,0x94,0x76,0x28,0xAB,0xF5,0x17,0x49,0x08,0x56,0xB4,0xEA,0x69,0x37,0xD5,0x8B,
  0x57,0x09,0xEB,0xB5,0x36,0x68,0x8A,0xD4,0x95,0xCB,0x29,0x77,0xF4,0xAA,0x48,0x16,
  0xE9,0xB7,0x55,0x0B,0x88,0xD6,0x34,0x6A,0x2B,0x75,0x97,0xC9,0x4A,0x14,0xF6,0xA8,
  0x74,0x2A,0xC8,0x96,0x15,0x4B,0xA9,0xF7,0xB6,0xE8,0x0A,0x54,0xD7,0x89,0x6B,0x35
};
//CRC位域8查表算法(小端):
unsigned char GetCRCR8_8C_00_00_Table(unsigned char *crcBuff, unsigned char crcLen) {
unsigned char i;
unsigned char crc = 0x00;
  for(i = 0; i < crcLen; i ++) {
    crc = CRCR8_8C_Table[crc ^ crcBuff[i]];
  }
  return crc;
}
void main() {
const unsigned char dataTable[] = "\x01\x23\x45\x67\x89\xAB\xCD\xEF";
unsigned char crc;
  crc = GetCRCR8_8C_00_00_Table((unsigned char *)dataTable, sizeof(dataTable) - 1);
  while(1);
}

使用特权

评论回复
14
hotpower| | 2011-8-30 06:20 | 只看该作者
俺在考虑是否支持一些单片机的汇编语言。
例如像邓苗喜欢的51ASM。

使用特权

评论回复
15
Cortex-M0| | 2011-8-30 07:14 | 只看该作者
哈哈~~~

相比菜农大叔的非典之作,俺更喜欢看邓苗同志的51汇编,经典之作啊,比俺N年前搞技术时还高出一节~~~

菜农大叔的非典应用,俺看了都头大,若要移植,一不小心就杯具,更不要说小盆友了,呵呵~~~

使用特权

评论回复
16
hotpower| | 2011-8-30 10:57 | 只看该作者
哈哈,有时间俺来个51汇编crc自动生成。

使用特权

评论回复
17
Cortex-M0| | 2011-8-30 15:18 | 只看该作者
尊惜生命,远离51~~~ :P

使用特权

评论回复
18
dengm|  楼主 | 2011-8-30 21:43 | 只看该作者
本帖最后由 dengm 于 2011-8-30 21:45 编辑

非典:  CRC 8
SUB_CRC8:
        MOV C, ACC.0
        XCH A, CRC8
        RLC A
        SWAP A
        XRL A, CRC8
        SWAP A
        JNC $+4
           XRL A, #47H
        XCH A, CRC8
        RET

使用特权

评论回复
19
dengm|  楼主 | 2011-8-30 21:59 | 只看该作者
本帖最后由 dengm 于 2011-8-30 22:01 编辑

非典:  CRC 32
           CRC_0  DATA 20H
           CRC_1  DATA 21H
           CRC_2  DATA 22H
           CRC_3  DATA 23H

SUB_CRC_32:
         MOV C, ACC.0    ; Bit0

         XCH A, CRC_0
         RLC A
         XCH A, CRC_0
         XCH A, CRC_1
         RLC A
         XCH A, CRC_1
         XCH A, CRC_2
         RLC A
         XCH A, CRC_2
         XCH A, CRC_3
         RLC A
         XCH A, CRC_3

         JNB ACC.1, $+5
             CPL CRC_0.3  ; BIT 3
         JNB ACC.2, $+5
             CPL CRC_0.5  ; BIT 5
         JNB ACC.3, $+5
             CPL CRC_1.0  ; BIT 8
         JNB ACC.4, $+5
             CPL CRC_1.2  ; BIT 10
         JNB ACC.5, $+5
             CPL CRC_1.5  ; BIT 13
         JNB ACC.6, $+5
             CPL CRC_2.0  ; BIT 16
         JNB ACC.7, $+5
             CPL CRC_2.2  ; BIT 18
          JNC CRC_EX
              XRL CRC_2, #40H
              XRL CRC_0, #07H
CRC_EX:
          RET

使用特权

评论回复
20
NE5532| | 2011-8-30 22:02 | 只看该作者
其实还有一个办法,比如串口来数之类算CRC,边收边算就最快了。

使用特权

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

本版积分规则

5

主题

823

帖子

0

粉丝