


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本科生实验报告课程名称:计算机原理与应用实验名称:计算 CRC-32 校验和任课教师:实验教师:实验日期:2020 年 11 月 9 日实验地点:北京理工大学良乡校区实验类型: 原 理 验 证R 综 合 设 计创 新学生班级:05961809学号:1120182639学院:信息与电子学院专业:电子信息工程(实验班)组号:无同组同学:无成绩:大作业 1CRC-32 校验和的计算一、实验目的使用汇编语言编写一个计算 CRC-32 校验和的程序。二、实验原理多项式和二进制数有直接对应关系:x 的最高幂次对应二进制数的最,以下各位对应多项式的各幂次,有此幂次项对应 1,无此幂次项对应 0。可以看出:x
2、 的最高幂次为 R,转换成对应的二进制数有 R+1 位。生成多项式是接受方和方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。在方,利用生成多项式对信息多项式做模 2 除生成。在接受方利用生成多项式对收到的编码多项式做模 2 除检测和确定错误位置。应满足以下条件:a、生成多项式的最和最低位必须为 1。b、当被传送信息(CRC 码)任何一位发生错误时,被生成多项式做除后应该使余数不为 0。c、不同位发生错误时,应该使余数不同。d、对余数继续做除,应使余数循环。CRC位数 = 生成多项式位数 - 1。生成步骤如下:1、将x 的最高次幂为 R 的生成多项式 G(x)转换成对应的
3、 R+1 位二进制数。2、将信息码左移 R 位,相当于对应的信息多项式 C(x)*x 的R 次方。3、用生成多项式(二进制数)对信息码做除,得到 R 位的余数。4、将余数拼到信息码左移后空出的位置,得到完整的 CRC 码。三、实验要求1、 在程序时间段定义一个字符串用于测试 CRC-32 校验和的计算;2、 编写子程序计算 CRC-32 校验和,生成多项式:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。3、 主程序调用子程序计算校验和后,将结果输出到屏幕。4、 程序可以使用 16 位或 32 位汇编编写,需要在实验报告中注明开发环境。5、
4、 思考并回答:是否有两个字符串的 CRC-32 校验和是相同的?四、开发环境16 位汇编编写五、程序设计思路CRC-32 位校验和的计算实际上是生成多项式(二进制数)对补零后的字符串做除的过程。在这一过程中,我觉得有以下三个重点需要注意:一是运算过程中数据的保存,二是生成多项式对信息码做除,即异或运算,三是 CRC-32 校验和的输出。一、因为在运算过程中,会不断有新的余数产生,又要补充字符串对应的下一位二进制数和余数一起参与异或运算,所以我们在运算的时候,需要合理储存数据,避免产生错误。我将字符串存入到程序时间段里首地址为 DIVIDENT 的缓存区,在运算过程中,通过指针将缓存区参与运算的
5、数据提取到寄存器中,通过寄存器来参与运算,运算完毕后,再将寄存器中的结果存入到缓存区的对应位置。这样用的时候取出来,用完了放回去,就使得数据的调用和变动很有条理,产生错误。二、在计算 CRC-32 校验和运算时,首先在字符串后面补充 N-1 个 0,在本次试验中也就是 32 个 0,我是在时间段定义时直接完成了这个操作。之后的计算一般是从被除数的最开始,的 33 位数和除数做模二运算,然后将被除数的下一位二进制数补充到运算结果后 32位的后面,组成新的 33 位数再和除数做模二运算,以此类推,一直到补充的数是被除数的最后一位为止,此时的运算结果的后 32 位就是我们想要的 CRC-32 校验和
6、。我在运算过程中对以下面做了设计:首先在这一过程中,如果参与运算的 33 位被除数最是 0,我们是商 0,这样的话和这33 位被除数异或的就是 33 个 0,得到的结果还是 33 位被除数自身,所以当 33 位被除数的最高位是 0 时,我们的异或运算其实是没必要的。所以我利用这一点简化了算法,每一次将缓存区参与运算的数据提取到寄存区时,我先他的最是不是 0,如果是 0 的话,我直接进行下一组数据的运算,如果是 1,则正常移出,运算,存入。其次,我发现每一次异或运算之后我们关心的只有后 32 位(因为最的异或结果肯定是0),并且在生成多项式时,32 位的也比 33 位的要简单。所以我在生成多项式
7、保存了后 32 位到 AX,BX 中。在运算时,当我到该次参与运算的 33 位被除数的最是 1 时,我取后面的 32 位被除数到寄存器中去和 32 位除数做异或运算,将得到的结果全部返回到缓存区之前的位置中,这样就相当于将原来的两组 33 位异或运算数据的最(头)都砍掉,只留下了我们关心的后 32 位(身体部分),而最终得到的结果都是对我们有用的,既了空间,也不需要花费精力去选择性返回 32 位数据。最后如果我们每一次组成新的 32 位被除数都通过指针移动来完成的话,这无疑是一个很大的工作量,并且在定义指针移动时很可能会出错。所以我采用传送带的方法,每一次运算后我将整个缓冲区数据往左移一位,这
8、样就相当于抓取数据的窗口不动,我移动缓冲区数据将运算数据送到窗口,具体如下:每一次再进行下一组数据的比较;当最为 0 时,我将缓存区定义的数据整体左移一比特,最为 1 时,我先将缓存区的数据左移一位,也就是将 33位运算数据的头砍掉,之后将缓存区前 32 位数据取出来放到寄存器中参与运算。这样的话次运算前从缓存区取出的数据始终是缓存区的前 32 位数据,使得运算过程中的数据存取可以得到更好的,程序逻辑也比较简单。而在完成缓存区数据集体左移时,我是采用 RCL 来完成的。因为 RCL DIVIDENT,1 只能让 DIVIDENT 的首字节循环左移一位,但是后面的字节不循环左移。所以我首先从最低
9、位字节开始,将他取出来,存放到寄存器中,进行循环左移一位之后再放回去,这样他的最比特就是进位标志位 CF 的值,然后通过带进位与 0 相加的方法将 CF 保存在寄存器(DL)里(因为后面要做循环次数减一,会影响标志位),之后循环次数减一,将右边第二位字节取出来,放到寄存器里,先将 DL(CF 保存寄存器)与 0FFH 相加,这样 CF 的值就是上一次循环左移的进位,即上一字节的最比特,然后再对当前字节进行循环左移,依次进行,直到所有字节均循环左移。这样就完成了所有字节循环左移一位的操作。三、最后运算的结果是以十六进制的形式存放在缓冲区的前 32 位的,而我们想要的输出时二进制数。我在这里是受到
10、课堂练习习题的启发,使用了循环左移命令 RCL,我先将低位字循环左移一个比特,在将字循环左移一个比特,这样就相当于低位字的最比特移到了高比特移到了进位标志位 CF 里,然后我再通过带进位加法位字的最低比特,而字的最ADC 将这一位比特存入到寄存器 DX 里(DX 提前清零),再将 DL 里的数转换为 ASCII 码(加30H),再输出,显示的就是二进制数啦!如此循环,直到将 32 位二进制数全部输出为止。所以整体上程序设计思路是将被除数存入缓存区,除数存入寄存器,通过左移缓存区内 DIVITENT 的值来将参与运算的数据保存在 DIVITENT 的前四个字节里;每次运算只需将DIVITENT
11、的前四个字节取出放入寄存器,异或运算后再放回缓存区即可;再将 33 位异或通过去除最1 的方法将运算数据缩减为 32 位,这样每一次运算后的结果都是我们关心的所有数最是 1 还是 0 来选择是否进行异或运算,如果是 0 则直接移位,进行下据;并且通过一位运算,减少了运算次数,最后通过 RCL 命令完成十六进制到二进制的转换,然后转换为ASCII 码之后进行输出!六、流程图七、程序代码DATAS SEGMENT DIVIDENT DB A,0,0,0,0运算规则在后面补 32 个 0CNT EQU $-DIVIDENT;在程序时间段定义字符串测试 CRC-32 校验和,根据ANSWER DB T
12、he CRC-32 check code is:$;定义结果提示字符串DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV ES,AX;初始化段寄存器CALL PREPARECALL OPERATION CALL OUTPUT;调用 PREPARE 子程序,进行运算准备;调用 OPERATION 子程序,计算 CRC-32;调运 OUTPUT 子程序,输出 CRC-32PREPARE PROC MOV AX,0 MOV A
13、L,CNT MOV DL,8H MUL DLSUB AX,32 MOV CX,AX MOV AX,04C1H MOV BX,1DB7H32 位依次存到 AX,BX 中RET PREPARE ENDP;初始化 AX;对应即将用到的 MUL 指令规则,将被除数字节数存入 AL;一个字节对应 8 比特,;计算被除数对应二进制的长度;计算异或时需要移位的数目;将移位次数存入 CX;由于运算过程中只关心后 32 位异或结果,所以将生成多项式的低;完成准备工作,返回主程序,进行运算OPERATION PROC COMPARE:LEA SI,DIVIDENT;将被除数的有效地址传送至 SI 寄存器MOV D
14、H,80H CMP DH,SI JA ADDRESS直接移位;80H 对应二进制 1000 0000,用于是否为 1被除数最;被除数最;被除数最是不是 1不是 1,无需进行异或(与 0 异或,结果是)JCXZ END0继续运算DEC CX;循环次数是否为 0,为 0 则运算完毕,跳到 END0,不为 0 则;循环次数减一;以下 11 行作用:被除数最是一,将被除数左移一位后与生成多项式后 32 位进行异或MOV DI,CNT MOV DX,0LEFT1:;定义移位次数MOV DH,DIVIDENTDI-1 ;从低到缓存区数据存入 DH 进行移位ADD DL,0FFH RCL DH,1 MOV
15、DL,0ADC DL,0;将上一字节移位的进位标志位 CF 值从 DL 中还给 CF;数据位循环左移一位;保护进位标志位 CFMOV DIVIDENTDI-1,DH ;将移位后的数存到缓存区里DEC DIJNZ LEFT1;移位次数减一;移位次数不为 0 则继续移位MOV DH,SI MOV DL,SI+1 XOR DX,AX异或运算;将被除数最;被除数的最的一个字存入 DX,参与运算字和除数的最字(不包括第 33 位的 1)进行MOV DIVIDENT0,DH MOV DIVIDENT1,DLMOV DH,SI+2;将异或结果放回被除数中MOV DL,SI+3XOR DX,BX;将被除数的次
16、字存入 DX,参与运算;被除数的次字和除数的最低位字进行异或运算MOV DIVIDENT2,DH MOV DIVIDENT3,DLJMP COMPARE;将异或结果放回被除数中;返回 COMPARE,进行下一次运算ADDRESS: JCXZ END0继续运算DEC CX;循环次数是否为 0,为 0 则运算完毕,跳到 END0,不为 0 则;循环次数减一;以下 11 行作用:被除数最是 0,将被除数左移一位MOV DI,CNT MOV DX,0LEFT2:;定义移位次数MOV DH,DIVIDENTDI-1 ;从低到缓存区数据存入 DH 进行移位ADD DL,0FFH;将上一字节移位的进位标志位
17、 CF 值从 DL 中还给 CFRCL DH,1MOV DL,0 ADC DL,0;数据位循环左移一位;保护进位标志位 CFMOV DIVIDENTDI-1,DH ;将移位后的数存到缓存区里DEC DIJNZ LEFT2;移位次数减一;移位次数不为 0 则继续移位JMP COMPARE ENd0:RETOPERATION ENDP;最不是一,不参与异或,跳回 COMPARE 继续比较;运算工作结束,返回主程序进行输出OUTPUT PROC MOV BH,SI MOV BL,SI+1 MOV CH,SI+2 MOV CL,SI+3MOV SI,32;将最终的 CRC存入到 BX,CX 中;将比特
18、输出字数存入 SI 寄存器LEA DX,ANSWER MOV AH,09HINT 21H;将 DX 指向输出字符串的首地址;输出字符串BINARY: RCL CX,1RCL BX,1;通过循环左移命令将寄存器中CRC-32对应的二进制数从高到低依次放入 CF 进位标志位中MOV DX,0H ADC DL,30H存放在 DL 中MOV AH,02H INT 21HDEC SI JZ END0JMP BINARY;将 DX 寄存器清零;通过带进位加法将存放在CF 标志位中的二进制数转换为ASCII 码;输出二进制码;循环次数减一;循环次数是否为 0,为 0 的话跳到 END0,程序;循环次数不为
19、0,回到 BINARY,进行下一位比特输出END0:RET OUTPUT ENDP;输出工作结束,返回主程序MOV AH,4CHINT 21HCODES ENDSEND START八、运行结果程序时间段定义字符串为ABCDEFG。程序时间段定义字符串为ABCDEFGHIJKLMNOPQRSTUVWXYZ。九、思考题会有两个字符串的 CRC-32 校验和是相同的。十、收获和体会在这一次大作业的完成过程中,我感觉收获了很多,大概可以分为以下五点:一是强化了我编程中分模块进行的这种思想。在编程过程中,凡是比较繁琐的运算都容易造成思绪的,而分模块进行可以帮助我们构建一个运算框架,更清楚地理解算法的结构
20、,这样在写代码的过程中只需要填充不同模块,不仅能保证我们的思维清晰,也能让我们的代码更有可读性,而通过这一次的作业,我感觉的这种分模块的思想得到了进一步的强化,相信这也是建议我们合理使用子程序的良苦用心之一;二是在这次作业过程中程序设计思路有了小小的。在以前编程求 CRC时,不需要异我也用过传送带这种方法来得到参与运算的 33 位被除数,同样使用过最是 0或运算的想法,但是从那里学到的。而在这一次作业中,我通过思考,发现 33位运算的最并不是我们所关心的,再考虑到 32 位数字的特殊性,想出了只进行 32 位数据异或的方法,减少了寄存器的使用,同时也使得程序设计更为简单,这是让我很开心的事情,
21、同时在这次作业也帮助我回顾了以前用过的方法,印象更加深刻。三是通过这次实验,我练习并掌握了异或运算、子程序以及 CRC的相关知识。在以前,虽然异或运算和子程序的使用也记忆过,但却从来没有在编程中使用过。这一次通过使用异或和子程序完成作业,理论与实践相结合,对于这两块的知识理解更加深刻。同时,也复习了以前学习过的 CRC的计算这一知识点,巩固了记忆,加深了印象。四是在这一次作业中掌握了一种十六进制转换为二进制数的方法。在刚开始做大作业的时候,我对于如何将寄存器里的数据转换为二进制数输出没有头绪,所以刚开始是先完成了CRC-32计算的模块,最后的输出是将寄存器里的数输出为十六进制,从而来检验程序的正确性。恰好在完成课堂练习时,看到了 RCL 命令的使用例题,推理了那一道题的功能,回顾了 RCL 命令作用之后,顿时产生了灵感,将这个指令用在了输出二进制数上面,结果发现效果不错,不仅得到了要的结果,而且代码相对较短,感觉很有成就感!五是通过的不断摸索,掌握了一种将缓存区内数据整体左移一位的方法。刚开始我是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 罐装水包装设计原理与视觉传达考核试卷
- 豆类食品的烹饪技巧与风味考核试卷
- 小学生预防夏季传染病
- 免疫靶点药物治疗
- 网络游戏虚拟道具设计版权归属与市场拓展合作补充协议
- 物流包装设备采购与物流包装质量检测技术支持协议
- 直播平台虚拟礼物知识产权保护及广告投放协议
- 古建筑碳纤维加固施工与施工进度跟踪合同
- 家族企业员工忠诚协议与财富隔离及知识产权保护合同
- 理财市场风险控制补充协议
- 湖北省鄂东南2025年春季高三年级五月模拟考物理试题及答案
- 游戏室电竞椅行业跨境出海战略研究报告
- 2025年心理咨询师考试试题及答案
- 初二下学期期中家长会发言稿
- 《计算机网络基础》课件
- 四川省资阳市乐至县2025年三年级数学第二学期期末达标检测试题含解析
- 钢结构吊装监理实施细则
- 【七下HK数学】安徽省合肥市五十中学东校2023-2024学年七年级下学期期中数学试卷
- 广东省广州市2025年中考地理模拟卷
- 药店质量负责人聘用合同范例二零二五年
- 保密知识培训课件
评论
0/150
提交评论