DATA SEGMENT ;数据段开始
STR DB ' CRC CODE IS:$' ;提示信息
DATA ENDS ;数据段结束
CODE SEGMENT ;代码段开始
MAIN PROC FAR ;主函数
ASSUME CS:CODE,DS:DATA ;段对齐
START: ;执行代码开始
MOV AX,DATA ;数据段地址送入AX
MOV DS,AX ;数据段寄存器值设为AX
MOV AH,1 ;选定一号DOS中断方式
INT 21H ;实现输入一个字符
LX:
MOV BL,AL ;输入字符的ASCII码送入BL
CALL BIN ;以二进制形式输出其ASCII码值
AND AL,0F0H ;取AL中高四位
CALL MDIV ;输出其高四位对应的CRC码(7,3)码
MOV AL,BL ;BL数据送入AL
AND AL,0FH ;取低四位
MOV CL,4 ;
SHL AL,CL ;把AL的低四位送入高四位
CALL MDIV ;输出其对应的CRC码
MOV DL,0DH
MOV AH,2
INT 21H ;输出回车
MOV DL,0AH
INT 21H ;输出换行
MOV AH,1 ;
INT 21H ;输入下一个字符
CMP AL,13 ;判断是不是回车
JNZ LX ;不是则继续循环
MOV AX,4C00H ;
INT 21H ;返回操作系统
MAIN ENDP ;主函数结束
BIN PROC ;BL中的数据二进制形式输出
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保存各寄存器的值
MOV CL,8 ;设置循环次数为8
MOV AH,2 ;设置AH初始值为2
CMP DL,'N' ;判断是否需要回车换行
JZ GOON ;不需要则跳过下面的回车换行
MOV DL,0AH ;
INT 21H ;换行
MOV DL,0DH
INT 21H ;回车
GOON:
SHL BL,1 ;BL逻辑左移一位
JC OUT1 ;如果移入CF的值为一则跳到OUT1输出'1'
MOV DL,30H
INT 21H ;输出'0'
JMP EXIT1 ;跳过下面的输出'1'
OUT1:
MOV DL,31H
INT 21H ;输出'1'
EXIT1:
LOOP GOON ;循环
POP DX
POP CX
POP BX
POP AX ;恢复各寄存器的值
RET ;子程序返回
BIN ENDP ;子程序结束
MDIV PROC ;将AL中的数据转换为CRC码(7,3)码
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保存个寄存器的值
MOV BL,AL ;保存AL的值到BL
MOV BH,AL ;保存AL的值到BH
MOV CL,4 ;
SHR BL,CL ;BL中的数据高四位送入低四位
CALL BIN ;二进制输出其欲编码的数据
LEA DX,STR ;提示信息的地址送入DX
MOV AH,9
INT 21H ;显示提示信息
MOV DL,BH ;欲编码数据送入DL
MOV BL,BH ;欲编码数据送入BL
MOV CX,4 ;设置循环次数
LOP1:
SHL BH,1 ;判断BH最高位
JNC NEXT ;为0则跳过下一行
XOR BL,10110000B ;实现BL中的高四位与1011进行模2加减
NEXT:
SHL BL,1 ;BL数据左移一位
MOV BH,BL ;将当前BL值送入BH
LOOP LOP1 ;循环
MOV CL,5 ;设置移位次数
SHR BL,CL ;BL逻辑右移5位
SHR DL,1 ;DL逻辑右移1位
XOR DL,BL ;使DL中的4位原数据后面接上与BL中的3位余数
MOV BL,DL ;保存DL到BL
MOV DL,'N' ;设置在BIN函数中输出时不换行
CALL BIN ;二进制输出其对应的CRC编码
POP DX
POP CX
POP BX
POP AX ;恢复各积存器的值
RET ;子程序返回
MDIV ENDP ;子程序结束
CODE ENDS ;代码段结束
END START ;程序结束
STR DB ' CRC CODE IS:$' ;提示信息
DATA ENDS ;数据段结束
CODE SEGMENT ;代码段开始
MAIN PROC FAR ;主函数
ASSUME CS:CODE,DS:DATA ;段对齐
START: ;执行代码开始
MOV AX,DATA ;数据段地址送入AX
MOV DS,AX ;数据段寄存器值设为AX
MOV AH,1 ;选定一号DOS中断方式
INT 21H ;实现输入一个字符
LX:
MOV BL,AL ;输入字符的ASCII码送入BL
CALL BIN ;以二进制形式输出其ASCII码值
AND AL,0F0H ;取AL中高四位
CALL MDIV ;输出其高四位对应的CRC码(7,3)码
MOV AL,BL ;BL数据送入AL
AND AL,0FH ;取低四位
MOV CL,4 ;
SHL AL,CL ;把AL的低四位送入高四位
CALL MDIV ;输出其对应的CRC码
MOV DL,0DH
MOV AH,2
INT 21H ;输出回车
MOV DL,0AH
INT 21H ;输出换行
MOV AH,1 ;
INT 21H ;输入下一个字符
CMP AL,13 ;判断是不是回车
JNZ LX ;不是则继续循环
MOV AX,4C00H ;
INT 21H ;返回操作系统
MAIN ENDP ;主函数结束
BIN PROC ;BL中的数据二进制形式输出
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保存各寄存器的值
MOV CL,8 ;设置循环次数为8
MOV AH,2 ;设置AH初始值为2
CMP DL,'N' ;判断是否需要回车换行
JZ GOON ;不需要则跳过下面的回车换行
MOV DL,0AH ;
INT 21H ;换行
MOV DL,0DH
INT 21H ;回车
GOON:
SHL BL,1 ;BL逻辑左移一位
JC OUT1 ;如果移入CF的值为一则跳到OUT1输出'1'
MOV DL,30H
INT 21H ;输出'0'
JMP EXIT1 ;跳过下面的输出'1'
OUT1:
MOV DL,31H
INT 21H ;输出'1'
EXIT1:
LOOP GOON ;循环
POP DX
POP CX
POP BX
POP AX ;恢复各寄存器的值
RET ;子程序返回
BIN ENDP ;子程序结束
MDIV PROC ;将AL中的数据转换为CRC码(7,3)码
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保存个寄存器的值
MOV BL,AL ;保存AL的值到BL
MOV BH,AL ;保存AL的值到BH
MOV CL,4 ;
SHR BL,CL ;BL中的数据高四位送入低四位
CALL BIN ;二进制输出其欲编码的数据
LEA DX,STR ;提示信息的地址送入DX
MOV AH,9
INT 21H ;显示提示信息
MOV DL,BH ;欲编码数据送入DL
MOV BL,BH ;欲编码数据送入BL
MOV CX,4 ;设置循环次数
LOP1:
SHL BH,1 ;判断BH最高位
JNC NEXT ;为0则跳过下一行
XOR BL,10110000B ;实现BL中的高四位与1011进行模2加减
NEXT:
SHL BL,1 ;BL数据左移一位
MOV BH,BL ;将当前BL值送入BH
LOOP LOP1 ;循环
MOV CL,5 ;设置移位次数
SHR BL,CL ;BL逻辑右移5位
SHR DL,1 ;DL逻辑右移1位
XOR DL,BL ;使DL中的4位原数据后面接上与BL中的3位余数
MOV BL,DL ;保存DL到BL
MOV DL,'N' ;设置在BIN函数中输出时不换行
CALL BIN ;二进制输出其对应的CRC编码
POP DX
POP CX
POP BX
POP AX ;恢复各积存器的值
RET ;子程序返回
MDIV ENDP ;子程序结束
CODE ENDS ;代码段结束
END START ;程序结束