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

📄 crc_a51.asm

📁 用51汇编编写的CRC-4校验程序,生成多项式g(x) = x4 + x + 1, 非常适合数据量不大的场合.
💻 ASM
字号:
; crc_a51.asm 
; CRC-4生成程序
; g(x) = x4 + x + 1
; 
dataBuffer  EQU      0x20
            
            org      0x000
Start:
            mov      SP, #0x50
;
            mov      dataBuffer,    0x08        
            mov      dataBuffer + 1,0x20        
            mov      dataBuffer + 2,0x08
            mov      dataBuffer + 3,0x09
            mov      dataBuffer + 4,0x23
            mov      dataBuffer + 5,0x12        
            mov      dataBuffer + 6,0x34
            mov      dataBuffer + 7,0x50        ; 注意:最后字节的低4位保留给CRC

            mov      R1,#dataBuffer             ; 数据首地址
            mov      R5,#0x08                   ; 数据字节数
            acall    CRCEngine
    
            sjmp     $
; *************************************************************************
; 功能:     计算4位CRC校验
; 入口参数: R1-数据首址, R5-数据字节数
; 出口参数: R7-CRC校验码
; *************************************************************************
CRCEngine:
            mov      R6,0x01

            mov      R4,0x06
            inc      R6
            mov      R0,0x04
            mov      A,@R0
            mov      R4,A                        ; 将首字节内容装入crc

            dec      R5                          ; 字节数减1

CRCEngine_1:
            mov      A,R5     
            jz       CRCEngine_2                 ; 判定所有字节计算结束
                                 
            mov      R3,0x06
            inc      R6
            mov      R0,0x03
            mov      A,@R0
            mov      R3,A                        ; 将缓冲内容装入移位buf  

            clr      A
            mov      R7,A

CRCEngine_1_1:
            clr      CY
            mov      A, R3
            rlc      A
            mov      R3, A                       ; buf左移
            mov      A,R4
            rlc      A                           ; CRC左移

CRCEngine_1_2:
            jnc      CRCEngine_1_3
            xrl      A,#0x30                     ; CY为1则与立即数0x30相异或

CRCEngine_1_3:
            mov      R4,A      

            inc      R7
            cjne     R7,#0x08, CRCEngine_1_1     ; 不够8位则继续
            dec      R5
            sjmp     CRCEngine_1

CRCEngine_2:
            clr      A
            mov      R7,A

CRCEngine_2_1:
            clr      CY
            mov      A, R4
            rlc      A
            jnc      CRCEngine_2_2
            xrl      A,#0x30                     ; CY为1则与立即数0x30相异或

CRCEngine_2_2:
            mov      R4,A

CRCEngine_2_3:
            inc      R7
            cjne     R7, #0x04, CRCEngine_2_1    ; 校验位添零,继续

            mov      A,R4
            swap     A
            anl      A,#0x0F
            mov      R7,A                        ; 返回CRC值
            ret

            END

⌨️ 快捷键说明

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