|
CLR C SUBB A,#16 ;CRC碼為2個(gè)字節(jié),16位 MOV R7,A CRC1: MOV A,@R0 ;緩存原數(shù)據(jù) MOV @R1,A INC R0 INC R1 DJNZ R2,CRC1 CLR A ;在原數(shù)據(jù)后添加2個(gè)零字節(jié) MOV @R1,A INC R1 MOV @R1,A CRC2: MOV A,#CRC_POINTER ;從最后一個(gè)字節(jié)開始左移一位 ADD A,CRC_NUM ;共有CRC_NUM+2個(gè)字節(jié) ADD A,#1 ;最后一個(gè)數(shù)據(jù)地址為 MOV R0,A ;R0=CRC_POINTER+CRC_NUM+2-1 MOV A,CRC_NUM ;計(jì)算參與移位計(jì)算的字節(jié)數(shù) ADD A,#2 ;保存在R1中 MOV R1,A ;R1=CRC_NUM+2 CLR C CRC3: MOV A,@R0 RLC A MOV @R0,A DEC R0 DJNZ R1,CRC3 ;判斷每移動(dòng)一位,所有參與移位的字節(jié)是否移完 JNC CRC4 ;進(jìn)行異或條件判斷 MOV A,#CRC_XORH XRL A,CRC_POINTER MOV CRC_POINTER,A MOV A,#CRC_XORL XRL A,CRC_POINTER+1 MOV CRC_POINTER+1,A CRC4: DJNZ R7,CRC2 ;判斷移位是否結(jié)束
CRC_END: RET
|