|
CRC16校驗的程序
;========================================================== DATA_BUFF EQU 10H CRC_NUM EQU 22H CRC_DATA EQU 23H CRC_POINTER EQU 30H ;========================================================== CRC_XORH EQU 10H ;11021=2^16+2^12+2^5+1 CRC_XORL EQU 21H ;========================================================== ORG 0000H AJMP MAIN MAIN: MOV CRC_DATA,#DATA_BUFF MOV CRC_NUM,#3 ACALL CRC AJMP MAIN ;========================================================== ; *****RC校驗子程序***** ; 多項式=2^16+2^12+2^5+1=11021H ;CRC_DATA-----進行CRC校驗的數(shù)據(jù)指針,保存需要進行CRC校驗的數(shù)據(jù)首址 ;CRC_POINTER--緩沖保存CRC校驗數(shù)據(jù)首址 ;CRC_NUM------保存所需進行CRC校驗的字節(jié)數(shù) ;R7-----------所有進行CRC校驗字節(jié)的位數(shù) , =(CRC_NUM+2)*8-16 ;========================================================== CRC: MOV R0,CRC_DATA MOV R1,#CRC_POINTER MOV R2,CRC_NUM MOV A,CRC_NUM ;R7=CRC_NUM*8 ADD A,#2 RL A RL A RL A CLR C SUBB A,#16 ;CRC碼為2個字節(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個零字節(jié) MOV @R1,A INC R1 MOV @R1,A CRC2: MOV A,#CRC_POINTER ;從最后一個字節(jié)開始左移一位 ADD A,CRC_NUM ;共有CRC_NUM+2個字節(jié) ADD A,#1 ;最后一個數(shù)據(jù)地址為 MOV R0,A ;R0=CRC_POINTER+CRC_NUM+2-1 MOV A,CRC_NUM ;計算參與移位計算的字節(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 ;判斷每移動一位,所有參與移位的字節(jié)是否移完 JNC CRC4 ;進行異或條件判斷 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 ;判斷移位是否結束
CRC_END: RET |