回 帖 发 新 帖 刷新版面

主题:[讨论]计算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个回复)

沙发

结果应该是A401H,但无论如何也得不出。

板凳

本来应该在此继续,按错了按钮:
[url=http://www.programfan.com/club/post-267996.html]http://www.programfan.com/club/post-267996.html[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册