crc_a51.asm

来自「用51汇编编写的CRC-4校验程序,生成多项式g(x) = x4 + x + 1」· 汇编 代码 · 共 99 行

ASM
99
字号
; 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 + =
减小字号Ctrl + -
显示快捷键?