




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学微机原理与借口技术课程设计CRC校验1 设计任务和要求可以对内存中的一段数据计算出校验和(CRC校验),通过修改某个值验证该校验 和是否正确。2 原理分析及程序设计 2.1原理分析2.1.1 CRC简介CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验,是一种利用除法及余数的原理来作错误侦测的编码,由于CRC易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,编码和解码方法简单,检错和纠错能力强,在各个领域广泛地应用。比如在我们解压一个RAR文件的时候,有时就会遇到CRC错误的提示。CRC“校验和”是两个数据流采用二进制除法相除所得到的余数,其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为n + 1的预定义的二进制数,通常用多项式的系数来表示。2.1.2 CRC计算方法在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。例如 1100101 可以表示为1x6+1x5+0x4+0x3+1x2+0x+1,即 x6+x5+x2+1。设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。计算方法是将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x),R(x)即为所要求的CRC,其关系为:Tx=xrP(x)+R(x)举例来说,设信息码为1100,生成多项式为1011,即Px=x3+x2,Gx=x3+x+1,计算CRC的过程为: xrP(x)G(x)=x3(x3+x2)x3+x+1=x6+x5x3+x+1=(x3+x2+x)+xx3+x+1即R(x)=x。注意到G(x)最高幂次r=3,得出CRC为010。2.2 程序设计2.2.1 CRC计算程序的编写明白原理之后,就可以写出算法了,当然不能如计算一样用除法来进行计算,因为寄存器的限制,不能处理很长的一串数据;可以用XOR运算来代替减法计算,但是基于位运算的算法是非常慢的而且效率低下,内存空间足够的情况下,可以采用查表法来计算满足速度要求,由于算法的每一步递推都是以字节为单位的,这样就比传统的以位为单位的算法要快上十几倍。数据序列的长度越长,其体现的优越性就越高。cal_crc16实现字符串CRC的计算。我们的算法如下:1. 将寄存器向右移动一个字节。2. 将刚移出的哪个字节与字符串中的新字节做XOR运算,得出一个指向CRC TABLE0255的索引。3. 将索引所指的表值与寄存器做XOR运算。4. 如数据没有全部处理完,则跳到步骤1。5得到CRC的值入口:DS:SI=buffer地址;CX buffer=长度;DX=CRC的初始值出口 DX=CRC的结果2.2.2 程序主界面的编写(1)通过使用各种中断及字符画功能可以实现操作提示以及画出主界面,比如在16进制数的最后面加H这样的单字符输入,我们可以采用DOS功能的02号中断;有些情况需要从键盘上输入字符,但不需要显示,我们可以采用DOS功能的08号中断。 (2)choose_function实现功能选择模块,当外界输入b的时候,则调用windows_main开始计算;当外界输入c的时候,则进行清屏;当外界输入q的时候,则跳出。(3)get_string及cal_len实现输入字符及长度的计算,即检测到中止符就跳出,长度存入len方便进行字符串的CRC计算。(4)bin_to_hex将结果转为十六进制,我们把二进制转换为16进制是每四位一转的转,若二进制表示的16进制数在“0到9”之间时,则只需将其ASCII码值加30h;若二进制表示的16进制数在9之外时,则将其ASCII码值加7h即可。然后,我们将这个二进制数左移4位,继续转换,最后输出在屏幕上3 程序流程图3.1总体框图 开始屏幕初始化,设置背景调用data1,显示提示信息及LOGO调用choose_function,实现功能选择显示提示输入信息,并调用windows_main开始进行计算调用get_string读取键盘输入调用cal_len读取输入字符数目调用cal_crc16计算得出字符串CRC值调用bin_to_hex,且显示出计算结果转换主程序利用BIOS中断来清屏结束图3-1 总体框图3.2 choose_function功能模块框图开始判断是否为s判断是否为q判断是否为cNNNYY跳到startp跳到quitY跳到clear显示错误信息显示提示信息 跳出结束图3-2 choose_function功能模块框图4 源代码详见附录5 运行结果 进入MF2KP,对程序进行编译、连接及运行,显示结果如下图所示。图5-1此时可以通过按下提示中的功能键进行功能选择,此时如果按下提示以外的按键会出现错误提示。图5-2正确选择功能后可以输入想要计算CRC的字符串,回车结束输入。图5-3此时可计算出刚才输入的字符串的CRC值。图5-4改变字符串最后一位进行CRC计算,CRC值发生了改变,满足设计要求。图5-5计算结束后可以按照提示清屏进行下次计算也可以退出程序。6调试记录及与分析最开始编写的程序运行结果无论什么数据CRC都是0,但是生成OBJ没有问题,算法也没有问题,调试界面跟踪计算中关键的入口出口及CRC,发现编写中因为寄存器不够用当时换DX保存CRC数据,但是计算CRC的子程序中存在没有改过来部分,导致了错误,更正后,问题得到解决。图6-17 结束语本次微机原理课程设计可以说是目前做过的课程设计中间最难的一个,刚刚接手可以说是一头雾水,虽然CRC这个词见过很多次,作用也明白,但是究竟算法是什么,如何实现等等完全一无所知。经过几天的资料查询,发现困难重重,因为虽然原理讲的相当明白,但是实现起来就不是一回事了,一开始决定用XOR代替减法实现CRC计算,但是三个循环嵌套写起来实在很麻烦,最后运行结果也出现很多问题,调试未果,只有尝试查表法,网上关于汇编的CRC资料真是少之又少,大部分都是C和VB的,最后终于在某个国外的网站上找到了一点资料,特别是CRC的table,终于弄出了核心部分的算法,然后在同学的帮助下完成了界面的编写,再不断的完善及调试,终于完成了程序。通过这次这次课程设计,我深深的认识到了课本上所教授的知识对于实际中的运用是远远不够的,需要在应用中不断的学习,另外编写过程中,常常有种想当然的想法,脑袋中构思的很好很强大,但是实现起来却有很多问题,使我明白了想象和实际是有变化和差距的,需要一点一点规划,摆正心态来认真去做,同时自己的基本功还不够扎实,需要多多学习和锻炼,才能不断提高。8 参考文献1 周佩玲编著.微机原理与接口技术(基于16位).电子工业出版社,2005年2 罗万钧编著.汇编语言程序设计.西安电子科技大学出版社,1999年3 杨立编著.微型计算机原理与汇编语言程序设计.中国水利水电出版社,2003年4 沈美明、温冬婵编著.IBM-PC汇编语言程序设计.北京:清华大学出版社.1991年5 微型计算机原理及应用 郑学坚 主编清华大学出版社2001年9 附录程序源代码disp macro m lea dx,m mov ah,9 int 21h endm;显示字符的宏定义stack1 segment para stack stack db 200 dup (0)stack1 endsdata1 segmentstr0 DB 0AH,0DH, *$ str1 DB 0AH,0DH, * *$ str2 DB 0AH,0DH, * NNNNNNNNN sNNNNNNNNNNN NNNNNNNNN *$str3 DB 0AH,0DH, * DNBNN=- zNNN- (NNNN sNNNNz- *$ str4 DB 0AH,0DH, * =NNNB sNNN zNNN= NNNN+ *$str5 DB 0AH,0DH, * BNNN zNNN +NBN= zNBNz *$ str6 DB 0AH,0DH, * NNND sNNN hNNN( BNNN- *$ str7 DB 0AH,0DH, * =NBN= zNNN- +NNND NNND *$ str8 DB 0AH,0DH, * sNNN zNNNhzzDNNNB NNNz *$ str9 DB 0AH,0DH, * zNBN zNNNNNNNBBz- NNNz *$ str10 DB 0AH,0DH, * sNNN+ zNNNNNNNND NNNh *$ str11 DB 0AH,0DH, * =NNNz zNNN=sNNND (NNNB *$ str12 DB 0AH,0DH, * NNNB sNBN- =NNNh NNNN( *$ str13 DB 0AH,0DH, * BBNNz sNNN DNNN+ hNNND *$ str14 DB 0AH,0DH, * =NNNNs zNNN NNNN- NNNND- *$ str15 DB 0AH,0DH, * NNNNNNNNNN sNNN BNBN NNNNNNNNNN *$str16 DB 0AH,0DH, * *$ str17 DB 0AH,0DH, *$str18 DB 0AH,0DH, * *$str19 DB 0AH,0DH, * Press s to start the programme *$str20 DB 0AH,0DH, * Press q to quit the programme *$str21 DB 0AH,0DH, * Press c to clear screen *$str22 DB 0AH,0DH, * Cyclic Redundancy Check Programme BUILD BY tl*$str23 DB 0AH,0DH, *$;LOGO及提示str_error db 0ah,0dh, Warning:Press error,please choose right function!,$str_enter db 0ah,0dh,$crc16_table label word ;00h dw 00000h, 0C0C1h, 0C181h, 00140h, 0C301h, 003C0h, 00280h, 0C241hdw 0C601h, 006C0h, 00780h, 0C741h, 00500h, 0C5C1h, 0C481h, 00440hdw 0CC01h, 00CC0h, 00D80h, 0CD41h, 00F00h, 0CFC1h, 0CE81h, 00E40hdw 00A00h, 0CAC1h, 0CB81h, 00B40h, 0C901h, 009C0h, 00880h, 0C841h; 20hdw 0D801h, 018C0h, 01980h, 0D941h, 01B00h, 0DBC1h, 0DA81h, 01A40hdw 01E00h, 0DEC1h, 0DF81h, 01F40h, 0DD01h, 01DC0h, 01C80h, 0DC41hdw 01400h, 0D4C1h, 0D581h, 01540h, 0D701h, 017C0h, 01680h, 0D641hdw 0D201h, 012C0h, 01380h, 0D341h, 01100h, 0D1C1h, 0D081h, 01040h; 40hdw 0F001h, 030C0h, 03180h, 0F141h, 03300h, 0F3C1h, 0F281h, 03240hdw 03600h, 0F6C1h, 0F781h, 03740h, 0F501h, 035C0h, 03480h, 0F441hdw 03C00h, 0FCC1h, 0FD81h, 03D40h, 0FF01h, 03FC0h, 03E80h, 0FE41hdw 0FA01h, 03AC0h, 03B80h, 0FB41h, 03900h, 0F9C1h, 0F881h, 03840h; 60hdw 02800h, 0E8C1h, 0E981h, 02940h, 0EB01h, 02BC0h, 02A80h, 0EA41hdw 0EE01h, 02EC0h, 02F80h, 0EF41h, 02D00h, 0EDC1h, 0EC81h, 02C40hdw 0E401h, 024C0h, 02580h, 0E541h, 02700h, 0E7C1h, 0E681h, 02640hdw 02200h, 0E2C1h, 0E381h, 02340h, 0E101h, 021C0h, 02080h, 0E041h; 80hdw 0A001h, 060C0h, 06180h, 0A141h, 06300h, 0A3C1h, 0A281h, 06240hdw 06600h, 0A6C1h, 0A781h, 06740h, 0A501h, 065C0h, 06480h, 0A441hdw 06C00h, 0ACC1h, 0AD81h, 06D40h, 0AF01h, 06FC0h, 06E80h, 0AE41hdw 0AA01h, 06AC0h, 06B80h, 0AB41h, 06900h, 0A9C1h, 0A881h, 06840h; A0hdw 07800h, 0B8C1h, 0B981h, 07940h, 0BB01h, 07BC0h, 07A80h, 0BA41hdw 0BE01h, 07EC0h, 07F80h, 0BF41h, 07D00h, 0BDC1h, 0BC81h, 07C40hdw 0B401h, 074C0h, 07580h, 0B541h, 07700h, 0B7C1h, 0B681h, 07640hdw 07200h, 0B2C1h, 0B381h, 07340h, 0B101h, 071C0h, 07080h, 0B041h; C0hdw 05000h, 090C1h, 09181h, 05140h, 09301h, 053C0h, 05280h, 09241hdw 09601h, 056C0h, 05780h, 09741h, 05500h, 095C1h, 09481h, 05440hdw 09C01h, 05CC0h, 05D80h, 09D41h, 05F00h, 09FC1h, 09E81h, 05E40hdw 05A00h, 09AC1h, 09B81h, 05B40h, 09901h, 059C0h, 05880h, 09841h; E0hdw 08801h, 048C0h, 04980h, 08941h, 04B00h, 08BC1h, 08A81h, 04A40hdw 04E00h, 08EC1h, 08F81h, 04F40h, 08D01h, 04DC0h, 04C80h, 08C41hdw 04400h, 084C1h, 08581h, 04540h, 08701h, 047C0h, 04680h, 08641hdw 08201h, 042C0h, 04380h, 08341h, 04100h, 081C1h, 08081h, 04040h;CRC16 TABLEdata_buf db 200 dup(?) ,$crc dw ?len dw ?info db 0AH,0DH, The CRC Code is:$info_input db 0AH,0Dh, Please input the string:$ data1 endscode segment assume cs:code,ds:data1,ss:stack1 START:main proc far display_log: mov ax,data1 mov ds,ax disp str0 disp str1 disp str2 disp str3 disp str4 disp str5 disp str6 disp str7 disp str8 disp str9 disp str10 disp str11 disp str12 disp str13 disp str14 disp str15 disp str16 disp str17 disp str18 disp str19 disp str20 disp str21 disp str22 disp str23;显示LOGO及提示信息 choose_function: mov ah,8 int 21h ; cmp al,s jz startp ;为s则跳到startp cmp al,q jz quit ;为q则跳到quit cmp al ,c jz clear ;为c则跳到clear disp str_error ;否则则显示错误信息 jmp display_log startp: disp info_input ;提示输入 call windows_main ;调用windows_main开始计算 jmp display_logclear: call clear_screen ;调用clear_screen清屏 jmp display_log quit: mov ah,4ch ;结束 int 21h retmain endp clear_screen proc near ;清屏 push ax push bx push cx push dx mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h mov dh,1 mov dl ,1 mov ah,2 mov bh,0 int 10h pop dx pop cx pop bx pop ax retclear_screen endpwindows_main proc near lea di,data_buf call get_string ;调用get_string读取输入字符 lea si,data_buf call cal_len ;调用cal_len计算读取输入字符长度 lea si,data_buf call cal_crc16 ;调用cal_crc计算CRC disp info mov bx,crc call Hex_Ascii ;调用Hex_Ascii转化成16进制cal: mov ah, 6h mov dl,0ffh int 21h cmp al,0dh ;如果检测到回车则跳出 jz exit2 jmp calexit2: ret windows_main endp;查表法计算CRC;入口:DS:SI=buffer地址; CX buffer=长度; DX=CRC的初始值;出口 DX=CRCcal_crc16 proc near push cx push dx mov cx,len mov dx,0 call crc16 mov cr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林业招工考试题库及答案
- 2025-2030中国整装式变电所行业发展动向与未来前景展望报告
- 课程改革考试题库及答案
- 2025-2030中国急救输液泵市场供需规模及未来运作模式分析报告
- 常见输液反应的护理
- 常见修辞手法的辨析
- 常用低压电器简介
- 帮助老人站立行走课件
- 湖北省武汉市东湖高新区2024-2025学年三年级下册期末考试语文试卷(含答案)
- 带教医师培训课件
- 妇女维权法律知识讲座
- 2025年内蒙古自治区中考语文真题含答案
- 2025版危险货物道路运输综合预案(电石)
- 2025年中医确有专长考试试题及答案
- DB32∕T 4553-2023 医疗机构医疗器械不良事件监测工作指南
- 2025年机关事业单位技能资格考试-政工历年参考题库含答案解析(5套共100道单选合辑)
- 关于工勤人员管理办法
- 传统丧事流程安排方案
- 妇产科学-第十二章-正常分娩课件
- 腓肠神经皮瓣课件
- 1【L】系列离心式冷水机组技术手册
评论
0/150
提交评论