MIPS汇编实验报告:斐波那契数列

MIPS汇编实验报告:斐波那契数列

设计思想:
首先先确定N的值,检查N是否异常。然后将所要求的16进制斐波那契数列分成高32位与低32位。分别对高低32位做运算(注意进位),若高32位溢出则报溢出错误,低32位溢出则进位。如果高32位的值为0,则用32位的方式输出16进制斐波那契数列,否则就用64位输出。
流程图:
在这里插入图片描述

MIPS代码:
.data
tip1: .asciiz “Please input the number N:”
tip3: .asciiz “Hexout:”
err_tip1: .asciiz “The number is lower than 0.\n”
err_tip2: .asciiz “blank”
hex_tab: .asciiz “0123456789ABCDEF”
out_limit: .asciiz “the array is out of limit”
dot: .asciiz ". "
qian: .asciiz “0x”
hexbox: .asciiz “00000000”
blank: .asciiz " "
return: .asciiz “\n”
.text
main: la $a0,tip1 #加载tip1的地址
li $v0,4
syscall #输出tip1
li $v0,5
syscall #输入N
move a 0 , a0, a0,v0 #将N存入a0
move s 3 , s3, s3,a0
sll a 3 , a3, a3,a0,3
subu s p , sp, sp,sp,$a3 #开辟8*N个字节的栈空间
la a 1 , ( a1,( a1,(sp) #指向栈尾
blez $a0,end1 #判断N是否小于0
beqz $a0,end2 #判断N是否等于0
li $s0,0
li $s1,1 #a[0]=a[1]=0
jal FIB
la $a0,tip3
li $v0,4
syscall #输出tip3
li $t9,1 #t9计数
la a 1 , ( a1,( a1,(sp)
loop3: lw t 0 , 4 ( t0,4( t0,4(a1)
lw t 1 , ( t1,( t1,(a1) #取出栈内的两个值
addiu a 1 , a1, a1,a1,8
move a 0 , a0, a0,t9
li $v0,1
syscall #输出数组下标
la $a0,dot
li $v0,4
syscall #输出分隔符.
la $a0,qian
li $v0,4
syscall
li $t2,7
beqz $t6,hexify2
hexify1: and t 3 , t3, t3,t0,0x0f
srl t 0 , t0, t0,t0,4
lb t 4 , h e x t a b ( t4,hex_tab( t4,hextab(t3)
sb t 4 , h e x b o x ( t4,hexbox( t4,hexbox(t2)
subu t 2 , t2, t2,t2,1
bgez $t2,hexify1
la $a0,hexbox
li $v0,4
syscall #高32位转换成16进制
li $t2,7
hexify2: and t 3 , t3, t3,t1,0x0f
srl t 1 , t1, t1,t1,4
lb t 4 , h e x t a b ( t4,hex_tab( t4,hextab(t3)
sb t 4 , h e x b o x ( t4,hexbox( t4,hexbox(t2)
subu t 2 , t2, t2,t2,1
bgez $t2,hexify2
la $a0,hexbox
li $v0,4
syscall #低32位转换成16进制
la $a0,blank
li $v0,4
syscall #输出数据间空格
addiu t 9 , t9, t9,t9,1
ble t 9 , t9, t9,s3,loop3 #循环
la $a0,return
li $v0,4
syscall #换行
addu s p , sp, sp,sp,$a2
li $v0,10
syscall
FIB: li $t0,0 #t0记录变量1高32位
li $t1,0 #t1记录变量1低32位
li $t2,0 #t2记录变量2高32位
li $t3,1 #t3记录变量2低32位
move t 9 , t9, t9,a0 #将N赋给t9
loop1: subiu $t5,$0,1
subu t 5 , t5, t5,t5,$t0
sltu t 8 , t8, t8,t5,$t2 #判断是否溢出
bgtz $t8,outlimit
sw t 2 , 4 ( t2,4( t2,4(a1)
sw t 3 , ( t3,( t3,(a1) #将数值存入栈
addiu a 1 , a1, a1,a1,8 #指针指向下一个栈空间
addu t 7 , t7, t7,t1,$t3 #低32位相加
subiu $t5,$0,1
subu t 5 , t5, t5,t5,$t1
sltu t 8 , t8, t8,t5,$t3 #t8记录低32位相加的进位
move t 1 , t1, t1,t3
move t 3 , t3, t3,t7
addu t 7 , t7, t7,t0,$t2 #高32位相加
addu t 7 , t7, t7,t7,$t8 #加上进位
move t 0 , t0, t0,t2
move t 2 , t2, t2,t7
subiu t 9 , t9, t9,t9,1 #i–
bgtz $t9,loop1 #循环
move t 6 , t6, t6,t0
jr $ra
end1: la $a0,err_tip1 #加载err_tip1的地址
li $v0,4
syscall
addu s p , sp, sp,sp,$a2 #恢复堆栈
li $v0,10
syscall
end2: la $a0,err_tip2 #加载err_tip2的地址
li $v0,4
syscall
addu s p , sp, sp,sp,$a2 #恢复堆栈
li $v0,10
syscall
outlimit: la $a0,out_limit
li $v0,4
syscall #输出溢出
addu s p , sp, sp,sp,$a2 #恢复堆栈
li $v0,10
syscall

测试结果:
Please input the number N:5
Hexout:1. 0x00000001 2. 0x00000001 3. 0x00000002 4. 0x00000003 5. 0x00000005

– program is finished running –
Please input the number N:47
Hexout:1. 0x00000001 2. 0x00000001 3. 0x00000002 4. 0x00000003 5. 0x00000005 6. 0x00000008 7. 0x0000000D 8. 0x00000015 9. 0x00000022 10. 0x00000037 11. 0x00000059 12. 0x00000090 13. 0x000000E9 14. 0x00000179 15. 0x00000262 16. 0x000003DB 17. 0x0000063D 18. 0x00000A18 19. 0x00001055 20. 0x00001A6D 21. 0x00002AC2 22. 0x0000452F 23. 0x00006FF1 24. 0x0000B520 25. 0x00012511 26. 0x0001DA31 27. 0x0002FF42 28. 0x0004D973 29. 0x0007D8B5 30. 0x000CB228 31. 0x00148ADD 32. 0x00213D05 33. 0x0035C7E2 34. 0x005704E7 35. 0x008CCCC9 36. 0x00E3D1B0 37. 0x01709E79 38. 0x02547029 39. 0x03C50EA2 40. 0x06197ECB 41. 0x09DE8D6D 42. 0x0FF80C38 43. 0x19D699A5 44. 0x29CEA5DD 45. 0x43A53F82 46. 0x6D73E55F 47. 0xB11924E1

– program is finished running –
Please input the number N:48
Hexout:1. 0x0000000000000001 2. 0x0000000000000001 3. 0x0000000000000002 4. 0x0000000000000003 5. 0x0000000000000005 6. 0x0000000000000008 7. 0x000000000000000D 8. 0x0000000000000015 9. 0x0000000000000022 10. 0x0000000000000037 11. 0x0000000000000059 12. 0x0000000000000090 13. 0x00000000000000E9 14. 0x0000000000000179 15. 0x0000000000000262 16. 0x00000000000003DB 17. 0x000000000000063D 18. 0x0000000000000A18 19. 0x0000000000001055 20. 0x0000000000001A6D 21. 0x0000000000002AC2 22. 0x000000000000452F 23. 0x0000000000006FF1 24. 0x000000000000B520 25. 0x0000000000012511 26. 0x000000000001DA31 27. 0x000000000002FF42 28. 0x000000000004D973 29. 0x000000000007D8B5 30. 0x00000000000CB228 31. 0x0000000000148ADD 32. 0x0000000000213D05 33. 0x000000000035C7E2 34. 0x00000000005704E7 35. 0x00000000008CCCC9 36. 0x0000000000E3D1B0 37. 0x0000000001709E79 38. 0x0000000002547029 39. 0x0000000003C50EA2 40. 0x0000000006197ECB 41. 0x0000000009DE8D6D 42. 0x000000000FF80C38 43. 0x0000000019D699A5 44. 0x0000000029CEA5DD 45. 0x0000000043A53F82 46. 0x000000006D73E55F 47. 0x00000000B11924E1 48. 0x000000011E8D0A40

– program is finished running –
Please input the number N:92
Hexout:1. 0x0000000000000001 2. 0x0000000000000001 3. 0x0000000000000002 4. 0x0000000000000003 5. 0x0000000000000005 6. 0x0000000000000008 7. 0x000000000000000D 8. 0x0000000000000015 9. 0x0000000000000022 10. 0x0000000000000037 11. 0x0000000000000059 12. 0x0000000000000090 13. 0x00000000000000E9 14. 0x0000000000000179 15. 0x0000000000000262 16. 0x00000000000003DB 17. 0x000000000000063D 18. 0x0000000000000A18 19. 0x0000000000001055 20. 0x0000000000001A6D 21. 0x0000000000002AC2 22. 0x000000000000452F 23. 0x0000000000006FF1 24. 0x000000000000B520 25. 0x0000000000012511 26. 0x000000000001DA31 27. 0x000000000002FF42 28. 0x000000000004D973 29. 0x000000000007D8B5 30. 0x00000000000CB228 31. 0x0000000000148ADD 32. 0x0000000000213D05 33. 0x000000000035C7E2 34. 0x00000000005704E7 35. 0x00000000008CCCC9 36. 0x0000000000E3D1B0 37. 0x0000000001709E79 38. 0x0000000002547029 39. 0x0000000003C50EA2 40. 0x0000000006197ECB 41. 0x0000000009DE8D6D 42. 0x000000000FF80C38 43. 0x0000000019D699A5 44. 0x0000000029CEA5DD 45. 0x0000000043A53F82 46. 0x000000006D73E55F 47. 0x00000000B11924E1 48. 0x000000011E8D0A40 49. 0x00000001CFA62F21 50. 0x00000002EE333961 51. 0x00000004BDD96882 52. 0x00000007AC0CA1E3 53. 0x0000000C69E60A65 54. 0x0000001415F2AC48 55. 0x000000207FD8B6AD 56. 0x0000003495CB62F5 57. 0x0000005515A419A2 58. 0x00000089AB6F7C97 59. 0x000000DEC1139639 60. 0x000001686C8312D0 61. 0x000002472D96A909 62. 0x000003AF9A19BBD9 63. 0x000005F6C7B064E2 64. 0x000009A661CA20BB 65. 0x00000F9D297A859D 66. 0x000019438B44A658 67. 0x000028E0B4BF2BF5 68. 0x000042244003D24D 69. 0x00006B04F4C2FE42 70. 0x0000AD2934C6D08F 71. 0x0001182E2989CED1 72. 0x0001C5575E509F60 73. 0x0002DD8587DA6E31 74. 0x0004A2DCE62B0D91 75. 0x000780626E057BC2 76. 0x000C233F54308953 77. 0x0013A3A1C2360515 78. 0x001FC6E116668E68 79. 0x00336A82D89C937D 80. 0x00533163EF0321E5 81. 0x00869BE6C79FB562 82. 0x00D9CD4AB6A2D747 83. 0x016069317E428CA9 84. 0x023A367C34E563F0 85. 0x039A9FADB327F099 86. 0x05D4D629E80D5489 87. 0x096F75D79B354522 88. 0x0F444C01834299AB 89. 0x18B3C1D91E77DECD 90. 0x27F80DDAA1BA7878 91. 0x40ABCFB3C0325745 92. 0x68A3DD8E61ECCFBD

– program is finished running –
Please input the number N:93
the array is out of limit
– program is finished running –
Please input the number N:-1
The number is lower than 0.

– program is finished running –

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值