《计算机组成原理》实验报告
年级、专业、班级 实验题目 实验时间 实验成绩 姓名 浮点数的表示和计算 实验地点 实验性质 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 报告创建时间:2014.12.30
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
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库浮点数的表示和计算在线全文阅读。
相关推荐: