📄 crc.asm
字号:
;CRC校验算法
SADDR EQU 2000H ;数据区首址(任意设置128字节数据)。
ERR BIT 00H ;出错标志。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV R3,#80H
MOV DPTR,#DATS
MOV P2,#HIGH(SADDR) ;片外RAM中数据存放首址。
MOV R0,#LOW(SADDR)
COPY: CLR A
MOVC A,@A+DPTR ;将测试数据存放到片外RAM中。
MOVX @R0,A
INC DPTR
INC R0
DJNZ R3,COPY
LCALL CRCOUT ;模拟发方生成CRC校验。
LCALL CHECK ;模拟收方进行CRC校验,应该没有差错。
MOV DPTR,#SADDR+20H ;模拟两个字节被破坏。
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
LCALL CHECK ;再次模拟收方进行CRC校验,应该发现差错。
STOP: LJMP STOP
CRCOUT: MOV DPTR,#SADDR+80H;将CRC存放单元初始化为零。
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
LCALL CRC ;计算CRC。
MOV DPTR,#SADDR+80H;将计算结果存放到数据块之后。
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
RET
CRC: MOV DPTR,#SADDR ;(CRC计算模块)先取两字节数据,
MOVX A,@DPTR ;作为最初的被除数。
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV R7,#80H ;以后的128字节依次作为被除数的补充。
CRC1: INC DPTR
MOVX A,@DPTR ;取一字节数据,作为被除数的补充。
MOV R4,A
MOV R5,#8 ;每字节要进行8次模2除法。
CRC2: MOV A,R4 ;三字节被除数的当前余数左移一位。
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
JNC CRC3 ;移出的最高位是0,不用处理。
XRL A,#10H ;移出的最高位是1,进行模2处理。
MOV R2,A
MOV A,R3
XRL A,#21H
MOV R3,A
CRC3: DJNZ R5,CRC2 ;处理完一个字节。
DJNZ R7,CRC1 ;处理完全部数据。
RET ;CRC校验码在R2R3之中。
CHECK: CLR ERR ;出错标志初始化。
LCALL CRC ;计算CRC。
MOV A,R2 ;结果为零否?
ORL A,R3
JZ CHKE
SETB ERR ;结果不为零,设立出错标志。
CHKE : RET
DATS: DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 10H,11H,12H,13H,14H,15H,16H,17H
DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH
DB 20H,21H,22H,23H,24H,25H,26H,27H
DB 28H,29H,2AH,2BH,2CH,2DH,2EH,2FH
DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,4AH,4BH,4CH,4DH,4EH,4FH
DB 50H,51H,52H,53H,54H,55H,56H,57H
DB 58H,59H,5AH,5BH,5CH,5DH,5EH,5FH
DB 60H,61H,62H,63H,64H,65H,66H,67H
DB 68H,69H,6AH,6BH,6CH,6DH,6EH,6FH
DB 70H,71H,72H,73H,74H,75H,76H,77H
DB 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -