
| 年级、专业、班级 | 姓名 | |||||
| 实验题目 | 浮点数的表示和计算 | |||||
| 实验时间 | 实验地点 | A主404 | ||||
| 实验成绩 | 实验性质 | □验证性 □设计性 □综合性 | ||||
| 教师评价: □算法/实验过程正确; □源程序/实验内容提交 □程序结构/实验步骤合理; □实验结果正确; □语法、语义正确; □报告规范; 其他: 评价教师签名: | ||||||
| 一、实验目的 (1) 深入掌握二进制数的表示方法以及不同进制数的转换; (2) 掌握二进制不同编码的表示方法; (3) 掌握IEEE 754 中单精度浮点数的表示和计算。 | ||||||
| 二、实验项目内容 假设没有浮点表示和计算的硬件,用软件方法采用仿真方式实现IEEE 754单精度浮点数的表示及运算功能,具体要求如下: (1) 程序需要提供人机交互方式(GUI或者字符界面)供用户选择相应的功能; (2) 可接受十进制实数形式的输入,在内存中以IEEE 754单精度方式表示,支持以二进制和十六进制的方式显示输出; (3) 可实现浮点数的加减乘除运算; (4) 可以使用80X86或MIPS或ARM汇编指令,但是不能使用浮点指令,只能利用整数运算指令来编写软件完成。 | ||||||
| 三、实验过程或算法(源程序) 1. 本次项目我们采用单精度浮点数格式读入两个浮点数,并读入一个操作符,然后根据操作符类型选择运算类型,加法指令如下: sum: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) #calculate the first number andi $s2, $s0, 0x80000000 # s2 is the sign srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exponent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fraction addi $s4, $s4, 0x00800000 #calculate the second number andi $s5, $s1, 0x80000000 # s5 is the sign srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exponent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fraction addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 blt $t0, 0, sumL1 # add sub bgt $t0, 0, sumL2 # sub add beq $t0, 0, sumL3 2. 减法指令如下: mysub: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) #calculate the first number andi $s2, $s0, 0x80000000 # s2 is the sign srl $s2, $s2, 31 andi $s3, $s0, 0x7f800000 # s3 is the exponent srl $s3, $s3, 23 andi $s4, $s0, 0x007fffff # s4 is the fraction addi $s4, $s4, 0x00800000 #calculate the second number xori $s5, $s1, 0x80000000 # s5 is the sign srl $s5, $s5, 31 andi $s6, $s1, 0x7f800000 # s6 is the exponent srl $s6, $s6, 23 andi $s7, $s1, 0x007fffff # s7 is the fraction addi $s7, $s7, 0x00800000 sub $t0, $s3, $s6 blt $t0, 0, subL1 # +,- bgt $t0, 0, subL2 # -,+ beq $t0, 0, subL3 # +,+ or -,- 3. 乘法指令如下: mutilStart: srl $t2, $s0, 31 srl $t3, $s1, 31 sll $t4, $s0, 1 srl $t4, $t4, 24 # exp sll $t5, $s1, 1 srl $t5, $t5, 24 # exp # 0...1frac sll $t6, $s0, 9 srl $t6, $t6, 9 ori $t6, $t6, 0x00800000 sll $t6, $t6, 8 addi $t4, $t4, 1 # 0...1frac sll $t7, $s1, 9 srl $t7, $t7, 9 ori $t7, $t7, 0x00800000 sll $t7, $t7, 8 addi $t5, $t5, 1 sub $t4, $t4, 127 add $t4, $t4, $t5 # final exp sub $t5, $t5, $t5 mutilCompareSign:add $t2, $t2, $t3 sll $t2, $t2, 31 # final sign multu $t6, $t7 mfhi $t5 #regular andi $t8, $t5, 0x80000000 beq $t8, 0x80000000, mutilnext sll $t5, $t5, 1 sub $t4, $t4, 1 mutilnext: sll $t5, $t5, 1 # IEEE754 sub $t4, $t4, 1 srl $t5, $t5, 9 # final fraction mutilFinal: sll $t4, $t4, 24 srl $t4, $t4, 1 addu $t2, $t2, $t4 addu $t2, $t2, $t5 # result add $s2, $t2, $zero # save result li $v0, 4 la $a0, msg3 syscall li $v0, 2 mtc1 $t2, $f12 syscall la $a0, msg0 # new line li $v0, 4 syscall lw $ra, 20($sp) lw $fp, 16($sp) addiu $sp, $sp, 32 jr $ra 4. 除法指令如下: divideStart: srl $t2, $s0, 31 srl $t3, $s1, 31 sll $t4, $s0, 1 srl $t4, $t4, 24 # exp sll $t5, $s1, 1 srl $t5, $t5, 24 # exp sll $t6, $s0, 9 srl $t6, $t6, 9 ori $t6, $t6, 0x00800000 sll $t7, $s1, 9 srl $t7, $t7, 9 ori $t7, $t7, 0x00800000 sub $t4, $t4, $t5 # final exp addi $t4, $t4, 127 sub $t5, $t5, $t5 divideCompareSign:add $t2, $t2, $t3 sll $t2, $t2, 31 # final sign sub $t8, $t8, $t8 # use to record divid sub $t3, $t3, $t3 # use to record remainder sub $t5, $t5, $t5 # use as counter dividecompare: bge $t5, 24, dividebreakout #compare the two number blt $t6, $t7, dividelower dividegreater: sub $t6, $t6, $t7 #divide is lower sll $t6, $t6, 1 sll $t8, $t8, 1 addi $t8, $t8, 1 addi $t5, $t5, 1 j dividecompare dividelower: sll $t6, $t6, 1 sll $t8, $t8, 1 addi $t5, $t5, 1 j dividecompare dividebreakout: blt $t8, 0x00800000, dividedoSll bge $t8, 0x01000000, dividedoSrl j divideresult dividedoSll: sll $t8, $t8, 1 subi $t4, $t4, 1 blt $t8, 0x00800000, dividedoSll j divideresult
dividedoSrl: srl $t8, $t8, 1 addi $t4, $t4, 1 bge $t8, 0x01000000, dividedoSrl j divideresult divideresult: bgt $t4, 255, divideoverFlow sll $t8, $t8, 9 srl $t8, $t8, 9 sll $t4, $t4, 24 srl $t4, $t4, 1 add $t2, $t2, $t4 add $t2, $t2, $t8 add $s2, $t2, $zero # save result li $v0, 4 la $a0, msg3 #output message syscall li $v0, 2 mtc1 $t2, $f12 syscall j diviedend 5. 十进制转换为二进制指令如下: dex2: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) add $a0, $s2, $zero add $t9, $zero, $a0 sub $t6, $t6, $t6 # set $t6=0 sub $t7, $t7, $t7 # set $t7=0 addi $t5, $zero, 32 # set $t5=32 as a counter addi $t8, $zero, 0x80000000 # set $t8=1000 0000 0000 0000 0000 0000 0000 0000 beginLoop: addi $t5, $t5, -1 # counter -- and $t7, $t8, $t9 srl $t8, $t8, 1 srlv $t7, $t7, $t5 add $a0, $t7, $zero #output one bit li $v0, 1 syscall beq $t5, $t6, Exist #if equals jump exist j beginLoop 6. 十进制转换为十六进制指令如下: dex16: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) sub $t0, $t0, $t0 # use as counter
srloop: bge $t0, 8, dex16end #16 addi $t0, $t0, 1 srl $t1, $s2, 28 sll $s2, $s2, 4 bgt $t1, 9, outchar li $v0, 1 add $a0, $t1, $zero syscall j srloop outchar: addi $t1, $t1, 55 # change to char li $v0, 11 add $a0, $t1, $zero syscall j srloop dex16end:la $a0, msg0 # new line li $v0, 4 syscall lw $ra, 20($sp) lw $fp, 16($sp) addiu $sp, $sp, 32 jr $ra | ||||||
| 四、实验结果及分析和(或)源程序调试过程 1. 实验结果: 本次实验我们以十进制实数形式的输入两个浮点数,在内存中以IEEE 754单精度方式表示,执行运算操作后,以十进制形式把结果输出,并且可以以二进制和十六进制的方式显示输出,下图是执行加法运算,并输出二进制形式: 下图是执行乘法操作,并输出十六进制形式: 减法运算如下图: 除法运算如下图: 当输入错误,如除数为0时,会显示错误信息并退出,如下图: 2. 实验分析: 本次实验我们使用MIPS汇编指令,利用整数运算指令来编写了一个浮点数运算程序,通过在MARS 4.4软件上进行调试运行,得到了正确结果,本次实验实现了以下功能: (1) 程序提供了人机交互方式(字符界面)供用户选择相应的功能; (2) 接受十进制实数形式的输入,在内存中以IEEE 754单精度方式表示,支持以二进制和十六进制的方式显示输出; (3) 实现了浮点数的加减乘除运算; (4) 没有使用浮点指令,只利用了整数运算指令来完成软件的编写。 3. 成员分工 :加、减、乘、除四个运算指令程序的编写。 :十进制转二进制,十进制转十六进制代码的编写。 实验报告由两人共同完成。 | ||||||
1、教师在布置需撰写实验报告的实验前,应先将报告书上的“实验题目”、“实验性质”、“实验目的”、“实验项目内容”等项目填写完成,然后再下发给学生。
2、教师在布置需撰写报告的实验项目时,应告知学生提交实验报告的最后期限。
3、学生应按照要求正确地撰写实验报告:
1)在实验报告上正确地填写“实验时间”、“实验地点”等栏目。
2)将实验所涉及的源程序文件内容(实验操作步骤或者算法)填写在“实验过程或算法(源程序)”栏目中。
3)将实验所涉及源程序调试过程(输入数据和输出结果)或者实验的分析内容填写在“实验结果及分析和(或)源程序调试过程”栏目中。
4)在实验报告页脚的“报告创建时间:”处插入完成实验报告时的日期和时间。
5)学生将每个实验完成后,按实验要求的文件名通过网络提交(上载)到指定的服务器所规定的共享文件夹中。每个实验一个电子文档,如果实验中有多个电子文档(如源程序或图形等),则用WinRAR压缩成一个压缩包文档提交,压缩包文件名同实验报告文件名(见下条)。
6)提交的实验报告电子文档命名为:“年级(两位数字不要“级”字)专业(缩写:计算机科学与技术专业(计科)、网络工程专业(网络)、信息安全专业(信息)、物联网工程(物联网))班级(两位数字)学号(八位数字)姓名实验序号(一位数字).doc。如学号为********、年级为2011级、专业为“计算机科学与技术”专业、班级为“02班”、姓名为“王宇”的学生,完成的第一次实验命名为: 11计科02班********王宇1.Doc,以后几次实验的报告名称以此类推。
4、教师(或助教)在评价学生实验时,应根据其提交的其他实验相关资料(例如源程序文件等)对实验报告进行仔细评价。评价后应完成的项目有:
1)在“成绩”栏中填写实验成绩。每个项目的实验成绩按照五级制(优、良、中、及格、不及格)方式评分,实验总成绩则通过计算每个项目得分的平均值获得(平均值计算时需将五级制转换为百分制优=95、良=85、中=75、及格=65、不及格=55)。
2)在“教师评价”栏中用符号标注评价项目结果(用√表示正确,用×表示错误,用≈表示 半对半错)。
3)在“教师评价”栏中“评价教师签名”填写评价教师(或助教)姓名。将评价后的实验报告转换为PDF格式文件归档。
4)课程实验环节结束后,任课教师将自己教学班的实验报告文件夹进行清理。在提交文件夹中,文件总数为实验次数×教学班学生人数(如,教学班人数为90人,实验项目为5,其文件数为:90×5=450)。任课教师一定要认真清理,总数相符,否则学生该实验项目不能得分。最后将学生提交的实验报告刻光盘连同实验成绩一起放入试卷袋存档。
