您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > 华中科技大学计算机系统基础实验报告
1课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24日计算机科学与技术学院2目录实验1:......................................................................................................2实验2:......................................................................................................9实验3:....................................................................................................23实验总结...................................................................................................321实验1:数据表示1.1实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。实验语言:c;实验环境:linux1.2实验内容需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。1.3实验设计源码如下:/**lsbZero-set0totheleastsignificantbitofx*Example:lsbZero(0x87654321)=0x87654320*Legalops:!~&^|+*Maxops:5*Rating:1*/intlsbZero(intx){//x右移一位再左移一位实现把最低有效位置0x=x1;x=x1;returnx;}/**byteNot-bit-inversiontobytenfromwordx*Bytesnumberedfrom0(LSB)to3(MSB)*Examples:getByteNot(0x12345678,1)=0x1234A978*Legalops:!~&^|+*Maxops:6*Rating:22*/intbyteNot(intx,intn){//x第n个字节每位都和1异或实现取反inty=0xff;n=n3;y=yn;x=(x^y);returnx;}/**byteXor-comparethenthbyteofxandy,ifitissame,return0,ifnot,return1*example:byteXor(0x12345678,0x87654321,1)=1*byteXor(0x12345678,0x87344321,2)=0*Legalops:!~&^|+*Maxops:20*Rating:2*/intbyteXor(intx,inty,intn){//把x和y的第n个字节取出来异或,再转换为逻辑的0和1n=n3;x=xn;y=yn;x=x&(0xff);y=y&(0xff);return!!(x^y);}/**logicalAnd-x&&y*Legalops:!~&^|+*Maxops:20*Rating:3*/3intlogicalAnd(intx,inty){//把x和y分别转化为逻辑的0和1,再相与x=(!(!x))&(!(!y));returnx;}/**logicalOr-x||y*Legalops:!~&^|+*Maxops:20*Rating:3*/intlogicalOr(intx,inty){//把x和y分别转化为逻辑的0和1,再相或x=(!(!x))|(!(!y));returnx;}/**rotateLeft-Rotatextotheleftbyn*Canassumethat0=n=31*Examples:rotateLeft(0x87654321,4)=0x76543218*Legalops:~&^|+!*Maxops:25*Rating:3*/introtateLeft(intx,intn){//先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&z即可intz;z=~(((131)31)n);x=((x(32+(~n+1)))&z)+(xn);returnx;}/**parityCheck-returns1ifxcontainsanoddnumberof1's*Examples:parityCheck(5)=0,parityCheck(7)=14*Legalops:!~&^|+*Maxops:20*Rating:4*/intparityCheck(intx){//每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1inty;y=x16;y=y^x;y=y^(y8);y=y^(y4);y=y^(y2);y=y^(y1);y=y31;return!(!y);}/**mul2OK-Determineifcancompute2*xwithoutoverflow*Examples:mul2OK(0x30000000)=1*mul2OK(0x40000000)=0**Legalops:~&^|+*Maxops:20*Rating:2*/intmul2OK(intx){//把x第31位和30位分别和1做按位与,再异或,再和1异或intm;m=((x31)&0x1)^((x30)&0x1);returnm^0x1;}/**mult3div2-multipliesby3/2roundingtoward0,*ShouldexactlyduplicateeffectofCexpression(x*3/2),5*includingoverflowbehavior.*Examples:mult3div2(11)=16*mult3div2(-9)=-13*mult3div2(1073741824)=-536870912(overflow)*Legalops:!~&^|+*Maxops:12*Rating:2*/intmult3div2(intx){//左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1inty=(x1)+x;y=(y1)+(((y31)&1)&(((y31)31)&1));returny;}/**subOK-Determineifcancomputex-ywithoutoverflow*Example:subOK(0x80000000,0x80000000)=1,*subOK(0x80000000,0x70000000)=0,*Legalops:!~&^|+*Maxops:20*Rating:3*/intsubOK(intx,inty){//x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判断溢出intm=(x31)&1;intn=(y31)&1;x=(m^n)&(m^(((x+(~y+1))31)&1));return(!x);}/**absVal-absolutevalueofx*Example:absVal(-1)=1.*Youmayassume-TMax=x=TMax6*Legalops:!~&^|+*Maxops:10*Rating:4*/intabsVal(intx){//x最高位为0时就是x,最高位为1时是~x+1inty=x31;x=(y&(~x+1))+((~y)&x);returnx;}/**float_abs-Returnbit-levelequivalentofabsolutevalueofffor*floatingpointargumentf.*Boththeargumentandresultarepassedasunsignedint's,but*theyaretobeinterpretedasthebit-levelrepresentationsof*single-precisionfloatingpointvalues.*WhenargumentisNaN,returnargument..*Legalops:Anyinteger/unsignedoperationsincl.||,&&.alsoif,while*Maxops:10*Rating:2*/unsignedfloat_abs(unsigneduf){intx=uf&(~(131));if(x0x7f800000){returnuf;}elsereturnx;}/**float_f2i-Returnbit-levelequivalentofexpression(int)f*forfloatingpointargumentf.*Argumentispassedasunsignedint,but*itistobeinterpretedasthebit-levelrepresentationofa7*single-precisionfloatingpointvalue.*Anythingoutofrange(includingNaNandinfinity)shouldreturn*0x80000000u.*Legalops:Anyinteger/unsignedoperationsincl.||,&&.alsoif,while*Maxops:30*Rating:4*/intfloat_f2i(unsigneduf){unsignednum=0x80000000;intx=(uf&0x007fffff)^0x00800000;intorder=0;order=(uf&0x7f800000)23;if(order158){returnnum;}if(order127)return0;elseif(((uf31)&1)==1){if(order150){return~(x(order-150))+1;}elsereturn~(x(150-order))+1;}else{if(order150)returnx(order-150);elsereturnx(150-order);}}1.4实验过程编写源码,运行btest,得出实验结果。1.5实验结果8可见13个函数全部正确。1.6实验小结此次实验主要考查的是对数据的处理,对此需要掌握数据在机器中的表示,运用合理的位运算来实现相应的功能。9实验2:BinaryBombs2.1实验概述本实验中,你要使用课程所学知识拆除一个“binarybombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。一个“binarybombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了6个阶段(phase1~phase6)。炸弹运行的每个阶段要求你输入一个特定的字符串,若你的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出BOOM!!!字样。实验的目标是拆除尽可能多的炸弹层次。每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增:*阶段1:字符串比较*阶段2:循环*阶段3:条件/分支*阶段4:递归调用和栈*阶段5:指针*阶段6:链表/指针/结构另外还有一个隐藏阶段,但只有当你在第4阶段的解之后附加一特定字符串后才会出现。为了完成二进制炸弹拆除任务,你需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码
本文标题:华中科技大学计算机系统基础实验报告
链接地址:https://www.777doc.com/doc-5608100 .html