主题:[讨论]计算CRC-16循环冗余校验码的程序问题
;1) 预置16 位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC 寄存器;
;2) 把第一个8 位数据与16 位CRC 寄存器的低位相异或,把结果放于CRC 寄存器;
;3) 把寄存器的内容右移一位(朝低位),用0 填补最高位,检查最低位(移出位);
;4) 如果最低位为0:重复第3 步(再次移位); 如果最低位为1:CRC 寄存器与多项式A001
;(1010 0000 0000 0001)进行异或;
;5) 重复步骤3 和4,直到右移8 次,这样整个8 位数据全部进行了处理;
;6) 重复步骤2 到步骤5,进行下一个8 位数据的处理;
TEMP EQU 40H
MOV TEMP,#1EH
MOV TEMP+1,#6
MOV TEMP+2,#20H
MOV TEMP+3,#0
MOV TEMP+4,#0
MOV TEMP+5,#2
MOV R0,#TEMP
MOV R3,#0FFH ;1.预置16 位寄存器为十六进制FFFF(即全为1),低字节
MOV R4,#0FFH ;预置16 位寄存器为十六进制FFFF(即全为1),高字节
CHKSUM_LP1:
MOV A,R3
XRL A,@R0 ;2.把第一个8 位数据与16 位CRC 寄存器的低位相异或,把结果放于CRC 寄存器
MOV R3,A ;并把结果放于CRC 寄存器
MOV R4,A
MOV R7,#8
CHKSUM_LP2:
MOV A,R4
CLR C ;用0 填补最高位
RLC A ;3.把寄存器的内容右移一位(朝低位),先移动高字节
MOV R4,A
MOV A,R3
RLC A ;把寄存器的内容右移一位(朝低位),再移动低字节
MOV R3,A ;
JNC CHKSUM_JP ;4.检查最低位(移出位),如果最低位为0:重复第3 步(再次移位)
XRL A,#001H ;如果最低位为1:CRC 寄存器与多项式A001 进行异或
MOV R3,A
MOV A,R4
XRL A,#0A0H
MOV R4,A
CHKSUM_JP:
DJNZ R7,CHKSUM_LP2 ;5.重复步骤3 和4,直到右移8 次,这样整个8 位数据全部进行了处理
INC R0
CJNE R0,#TEMP+6,CHKSUM_LP1 ;6.重复步骤2 到步骤5,进行下一个8 位数据的处理
RET
END
;2) 把第一个8 位数据与16 位CRC 寄存器的低位相异或,把结果放于CRC 寄存器;
;3) 把寄存器的内容右移一位(朝低位),用0 填补最高位,检查最低位(移出位);
;4) 如果最低位为0:重复第3 步(再次移位); 如果最低位为1:CRC 寄存器与多项式A001
;(1010 0000 0000 0001)进行异或;
;5) 重复步骤3 和4,直到右移8 次,这样整个8 位数据全部进行了处理;
;6) 重复步骤2 到步骤5,进行下一个8 位数据的处理;
TEMP EQU 40H
MOV TEMP,#1EH
MOV TEMP+1,#6
MOV TEMP+2,#20H
MOV TEMP+3,#0
MOV TEMP+4,#0
MOV TEMP+5,#2
MOV R0,#TEMP
MOV R3,#0FFH ;1.预置16 位寄存器为十六进制FFFF(即全为1),低字节
MOV R4,#0FFH ;预置16 位寄存器为十六进制FFFF(即全为1),高字节
CHKSUM_LP1:
MOV A,R3
XRL A,@R0 ;2.把第一个8 位数据与16 位CRC 寄存器的低位相异或,把结果放于CRC 寄存器
MOV R3,A ;并把结果放于CRC 寄存器
MOV R4,A
MOV R7,#8
CHKSUM_LP2:
MOV A,R4
CLR C ;用0 填补最高位
RLC A ;3.把寄存器的内容右移一位(朝低位),先移动高字节
MOV R4,A
MOV A,R3
RLC A ;把寄存器的内容右移一位(朝低位),再移动低字节
MOV R3,A ;
JNC CHKSUM_JP ;4.检查最低位(移出位),如果最低位为0:重复第3 步(再次移位)
XRL A,#001H ;如果最低位为1:CRC 寄存器与多项式A001 进行异或
MOV R3,A
MOV A,R4
XRL A,#0A0H
MOV R4,A
CHKSUM_JP:
DJNZ R7,CHKSUM_LP2 ;5.重复步骤3 和4,直到右移8 次,这样整个8 位数据全部进行了处理
INC R0
CJNE R0,#TEMP+6,CHKSUM_LP1 ;6.重复步骤2 到步骤5,进行下一个8 位数据的处理
RET
END