您好,欢迎访问三七文档
报告创建时间:2014.12.30《计算机组成原理》实验报告年级、专业、班级姓名实验题目浮点数的表示和计算实验时间实验地点A主404实验成绩实验性质□验证性□设计性□综合性教师评价:□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;□实验结果正确;□语法、语义正确;□报告规范;其他:评价教师签名:一、实验目的(1)深入掌握二进制数的表示方法以及不同进制数的转换;(2)掌握二进制不同编码的表示方法;(3)掌握IEEE754中单精度浮点数的表示和计算。二、实验项目内容假设没有浮点表示和计算的硬件,用软件方法采用仿真方式实现IEEE754单精度浮点数的表示及运算功能,具体要求如下:(1)程序需要提供人机交互方式(GUI或者字符界面)供用户选择相应的功能;(2)可接受十进制实数形式的输入,在内存中以IEEE754单精度方式表示,支持以二进制和十六进制的方式显示输出;(3)可实现浮点数的加减乘除运算;(4)可以使用80X86或MIPS或ARM汇编指令,但是不能使用浮点指令,只能利用整数运算指令来编写软件完成。三、实验过程或算法(源程序)1.本次项目我们采用单精度浮点数格式读入两个浮点数,并读入一个操作符,然后根据操作符类型选择运算类型,加法指令如下:sum:subu$sp,$sp,32sw$ra,20($sp)sw$fp,16($sp)addiu$fp,$sp,28sw$a0,0($fp)#calculatethefirstnumberandi$s2,$s0,0x80000000#s2isthesignsrl$s2,$s2,31andi$s3,$s0,0x7f800000#s3istheexponentsrl$s3,$s3,23andi$s4,$s0,0x007fffff#s4isthefractionaddi$s4,$s4,0x00800000#calculatethesecondnumberandi$s5,$s1,0x80000000#s5isthesignsrl$s5,$s5,31andi$s6,$s1,0x7f800000#s6istheexponentsrl$s6,$s6,23andi$s7,$s1,0x007fffff#s7isthefractionaddi$s7,$s7,0x00800000sub$t0,$s3,$s6blt$t0,0,sumL1#addsubbgt$t0,0,sumL2#subaddbeq$t0,0,sumL32.减法指令如下:mysub:subu$sp,$sp,32sw$ra,20($sp)sw$fp,16($sp)addiu$fp,$sp,28sw$a0,0($fp)#calculatethefirstnumberandi$s2,$s0,0x80000000#s2isthesignsrl$s2,$s2,31andi$s3,$s0,0x7f800000#s3istheexponentsrl$s3,$s3,23andi$s4,$s0,0x007fffff#s4isthefractionaddi$s4,$s4,0x00800000#calculatethesecondnumberxori$s5,$s1,0x80000000#s5isthesignsrl$s5,$s5,31andi$s6,$s1,0x7f800000#s6istheexponentsrl$s6,$s6,23andi$s7,$s1,0x007fffff#s7isthefractionaddi$s7,$s7,0x00800000sub$t0,$s3,$s6blt$t0,0,subL1#+,-bgt$t0,0,subL2#-,+beq$t0,0,subL3#+,+or-,-3.乘法指令如下:mutilStart:srl$t2,$s0,31srl$t3,$s1,31sll$t4,$s0,1srl$t4,$t4,24#expsll$t5,$s1,1srl$t5,$t5,24#exp#0...1fracsll$t6,$s0,9srl$t6,$t6,9ori$t6,$t6,0x00800000sll$t6,$t6,8addi$t4,$t4,1#0...1fracsll$t7,$s1,9srl$t7,$t7,9ori$t7,$t7,0x00800000sll$t7,$t7,8addi$t5,$t5,1sub$t4,$t4,127add$t4,$t4,$t5#finalexpsub$t5,$t5,$t5mutilCompareSign:add$t2,$t2,$t3sll$t2,$t2,31#finalsignmultu$t6,$t7mfhi$t5#regularandi$t8,$t5,0x80000000beq$t8,0x80000000,mutilnextsll$t5,$t5,1sub$t4,$t4,1mutilnext:sll$t5,$t5,1#IEEE754sub$t4,$t4,1srl$t5,$t5,9#finalfractionmutilFinal:sll$t4,$t4,24srl$t4,$t4,1addu$t2,$t2,$t4addu$t2,$t2,$t5#resultadd$s2,$t2,$zero#saveresultli$v0,4la$a0,msg3syscallli$v0,2mtc1$t2,$f12syscallla$a0,msg0#newlineli$v0,4syscalllw$ra,20($sp)lw$fp,16($sp)addiu$sp,$sp,32jr$ra4.除法指令如下:divideStart:srl$t2,$s0,31srl$t3,$s1,31sll$t4,$s0,1srl$t4,$t4,24#expsll$t5,$s1,1srl$t5,$t5,24#expsll$t6,$s0,9srl$t6,$t6,9ori$t6,$t6,0x00800000sll$t7,$s1,9srl$t7,$t7,9ori$t7,$t7,0x00800000sub$t4,$t4,$t5#finalexpaddi$t4,$t4,127sub$t5,$t5,$t5divideCompareSign:add$t2,$t2,$t3sll$t2,$t2,31#finalsignsub$t8,$t8,$t8#usetorecorddividsub$t3,$t3,$t3#usetorecordremaindersub$t5,$t5,$t5#useascounterdividecompare:bge$t5,24,dividebreakout#comparethetwonumberblt$t6,$t7,dividelowerdividegreater:sub$t6,$t6,$t7#divideislowersll$t6,$t6,1sll$t8,$t8,1addi$t8,$t8,1addi$t5,$t5,1jdividecomparedividelower:sll$t6,$t6,1sll$t8,$t8,1addi$t5,$t5,1jdividecomparedividebreakout:blt$t8,0x00800000,dividedoSllbge$t8,0x01000000,dividedoSrljdivideresultdividedoSll:sll$t8,$t8,1subi$t4,$t4,1blt$t8,0x00800000,dividedoSlljdivideresultdividedoSrl:srl$t8,$t8,1addi$t4,$t4,1bge$t8,0x01000000,dividedoSrljdivideresultdivideresult:bgt$t4,255,divideoverFlowsll$t8,$t8,9srl$t8,$t8,9sll$t4,$t4,24srl$t4,$t4,1add$t2,$t2,$t4add$t2,$t2,$t8add$s2,$t2,$zero#saveresultli$v0,4la$a0,msg3#outputmessagesyscallli$v0,2mtc1$t2,$f12syscalljdiviedend5.十进制转换为二进制指令如下:dex2:subu$sp,$sp,32sw$ra,20($sp)sw$fp,16($sp)addiu$fp,$sp,28sw$a0,0($fp)add$a0,$s2,$zeroadd$t9,$zero,$a0sub$t6,$t6,$t6#set$t6=0sub$t7,$t7,$t7#set$t7=0addi$t5,$zero,32#set$t5=32asacounteraddi$t8,$zero,0x80000000#set$t8=10000000000000000000000000000000beginLoop:addi$t5,$t5,-1#counter--and$t7,$t8,$t9srl$t8,$t8,1srlv$t7,$t7,$t5add$a0,$t7,$zero#outputonebitli$v0,1syscallbeq$t5,$t6,Exist#ifequalsjumpexistjbeginLoop6.十进制转换为十六进制指令如下:dex16:subu$sp,$sp,32sw$ra,20($sp)sw$fp,16($sp)addiu$fp,$sp,28sw$a0,0($fp)sub$t0,$t0,$t0#useascountersrloop:bge$t0,8,dex16end#16addi$t0,$t0,1srl$t1,$s2,28sll$s2,$s2,4bgt$t1,9,outcharli$v0,1add$a0,$t1,$zerosyscalljsrloopoutchar:addi$t1,$t1,55#changetocharli$v0,11add$a0,$t1,$zerosyscalljsrloopdex16end:la$a0,msg0#newlineli$v0,4syscalllw$ra,20($sp)lw$fp,16($sp)addiu$sp,$sp,32jr$ra四、实验结果及分析和(或)源程序调试过程1.实验结果:本次实验我们以十进制实数形式的输入两个浮点数,在内存中以IEEE754单精度方式表示,执行运算操作后,以十进制形式把结果输出,并且可以以二进制和十六进制的方式显示输出,下图是执行加法运算,并输出二进制形式:下图是执行乘法操作,并输出十六进制形式:减法运算如下图:除法运算如下图:当输入错误,如除数为0时,会显示错误信息并退出,如下图:2.实验分析:本次实验我们使用MIPS汇编指令,利用整数运算指令来编写了一个浮点数运算程序,通过在MARS4.4软件上进行调试运行,得到了正确结果,本次实验实现了以下功能:(1)程序提供了人机交互方式(字符界面)供用户选择相应的功能;(2)接受十进制实数形式的输入,在内存中以IEEE754单精度方式表示,支持以二进制和十六进制的方式显示输出;(3)实现了浮点数的加减乘除运算;(4)没有使用浮点指令,只利用了整数运算指令来完成软件的编写。3.成员分工:加、减、乘、除四个运算指令程序的编写。:十进制转二进制,十进制转十六进制代码的编写。实验报告由两人共同完成。备注:1、教师在布置需撰写实验报告的实验前,应先将报告书上的“实验题目”、“实验性质”、“实验目的”、“实验项目内容”等项目填写完成,然后再下发给学生。2、教师在布置需撰写报告的实验项目时,应告知学生提交实验报告的最后期限。3、学生应按照要求正确地撰写实验报告:1)在实验报告上正确地填写“实验时间”、“实验地点”等栏目。2)将实验所涉及的源程序文件内容(实验操作步骤或者算法)填写在“实验过程或算法(源程序)”栏目中。3)将实验所涉及源程序调试过程(输入数据和输出结果)或者实验的分析内容填写在“实验结果及分析和(或)源程序调试过程”栏
本文标题:浮点数的表示和计算
链接地址:https://www.777doc.com/doc-2210512 .html