TITLE=子程序注释 // CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB),移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码(16#A001)进行 异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。 // 下面为CRC的计算过程: // 1.设置CRC寄存器,并给其赋值FFFF(hex)。 // 2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 // 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。 // 4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。 // 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。 // 6.重复第2至第5步直到所有数据全部处理完成。 // 7.最终CRC寄存器的内容即为CRC值。 // // 输入参数: // 待校验数据区指针,第一个字节为数据长度 // LD0 DataBuff IN DWORD Network 1 LD SM0.0 MOVW 16#FFFF, AC0 //初始化CRC寄存器 BTI *LD0, LW4 //数据缓冲区第一个字节为数据长度 MOVD LD0, LD6 INCD LD6 //指针指向第一个待处理字节 Network 2 LD SM0.0 FOR AC2, +1, LW4 //开始循环处理每一个字节 Network 3 LD SM0.0 XORB *LD6, AC0 //字节首先与CRC寄存器低位进行异或 Network 4 LD SM0.0 FOR AC1, +1, +8 //移位处理循环,处理一个字节的8位 Network 5 LD SM0.0 SRW AC0, 1 //CRC寄存器右移一位 Network 6 LD SM1.1 //如果移出位为0,则进入下一次循环 XORW 16#A001, AC0 //如果移出位为1,CRC寄存器与多项式16#A001异或 Network 7 NEXT Network 8 LD SM0.0 INCD LD6 //指针加1指向下一个字节 Network 9 NEXT Network 10 LD SM0.0 SWAP AC0 //交换CRC寄存器高低字节 MOVW AC0, *LD6 //CRC校验值写入数据区结尾 |