用MIPS写2019年年历

编程入门 行业动态 更新时间:2024-10-21 23:06:37

用<a href=https://www.elefans.com/category/jswz/34/1759141.html style=MIPS写2019年年历"/>

用MIPS写2019年年历

2019年年历by MIPS

我在写2019年历的时候遇到了比较多的困难,而网上关于MIPS的代码又比较少,所以我在这贴一下我的代码,希望能帮到大家。
独立思考最重要!

.data
cal:	.space 2113
calname:.asciiz "JanFebMarAprMayJunJulAugSepOctNovDec"
start:	.asciiz "Put out the calendar of 2019: \n"
weekday:	.asciiz "SMTWTFS"
monday:	.word 31,28,31,30,31,30,31,31,30,31,30,31
end99:	.asciiz "\nEnding by XiaZeYu919106840637"
.text
main:	la $a0,start	#打印提示语li $v0,4la $s0,calnamesyscallla $s1,calsb $0,2112($s1)	#为空间末尾放置结束符li $t0,0x20li $t1,0
loop0:	sb $t0,($s1)	#为cal空间全部赋空格addi $s1,$s1,1addi $t1,$t1,1blt $t1,2112,loop0li $t0,0li $t1,0li $s1,0li $a0,2	#已知2019年1月1日是星期2li $a1,1	#$a1为月份
monLoop:jal monthmove $a0,$v0blt $a0,7,go_on0#当weekday为周日时清零addi $a0,$a0,-7
go_on0:	addi $a1,$a1,1bgt $a1,12,endb monLoop
end:	li $t0,0x0a	#为空间内每一层的末尾加上换行符la $t1,caladdi $t1,$t1,65li $t2,1
loop_n:	sb $t0,($t1)addi $t2,$t2,1addi $t1,$t1,66bgt $t2,32,enddb loop_n
endd:	la $a0,cal	#输出年历li $v0,4syscallla $a0,end99li $v0,4syscallli $v0,10	#结束syscall
month:	addi $a2,$a1,-1	#利用$a2来计算该月份的偏移量rem $t5,$a2,3mul $t5,$t5,22ble $a1,3,add1	#1-3月ble $a1,6,add2	#4-6月ble $a1,9,add3	#7-9月ble $a1,12,add4	#10-12月
add1:	la $a3,cal	#基址在第一大段b end_add
add2:	la $a3,caladdi $a3,$a3,528#把基址移到第二大段b end_add
add3:	la $a3,caladdi $a3,$a3,1056#把基址移到第三大段b end_add
add4:	la $a3,caladdi $a3,$a3,1584#把基址移到第四大段b end_add	
end_add:	add $a3,$a3,$t5	#让$a3存储每个月所在缓存区的基址#开始初始化每个月份表头li $t0,0	#loop1为初始化缓冲区内每个月份的坐标
loop1:	blt $t0,10,kong1bgt $t0,12,kong1add $t1,$a3,$t0lb $t2,($s0)sb $t2,($t1)addi $s0,$s0,1	#使$s0指向calname字符串中的下一个字符addi $t0,$t0,1b loop1
kong1:	add $t1,$a3,$t0	#输入空格的循环li $t2,0x20sb $t2,($t1)addi $t0,$t0,1bgt $t0,21,go_on1#当过了这个月份就跳出bne $t0,9,loop1	#当要输入月份数字时特殊处理addi $t0,$t0,-1bge $a1,10,ano1	#判断月份是否有十分位move $t2,$a1addi $t2,$t2,48sb $t2,($t1)addi $t0,$t0,1b loop1
ano1:li $t3,10		#当月份大于10时div $a1,$t3addi $t1,$t1,-1mflo $t2	#将月份的前一位放置addi $t2,$t2,48sb $t2,($t1)addi $t1,$t1,1mfhi $t2	#将月份的后一位放置addi $t2,$t2,48sb $t2,($t1)addi $t0,$t0,1b loop1
go_on1:	li $t0,0li $t1,0li $t2,0li $t3,0li $t5,0	#临时寄存器清零#开始初始化星期日期addi $t0,$a3,66	#将指针指向基址的下一层la $t1,weekday	#用$t1选择weekdayli $t3,0	#用$t3来记录已初始化天数,达七天跳出
loop2:	li $t2,0x20	#输入空格sb $t2,($t0)addi $t0,$t0,1lb $t2,($t1)	#输入weekdaysb $t2,($t0)addi $t0,$t0,1addi $t1,$t1,1li $t2,0x20	#输入空格sb $t2,($t0)addi $t0,$t0,1addi $t3,$t3,1	#已初始化天数加一bgt $t3,6,go_on2#当初始化完毕则跳出b loop2		#继续
go_on2:	li $t2,0x20	#输入两月间的空格sb $t2,($t0)#开始初始化具体日期li $t0,0	#清空临时寄存器li $t1,0li $t2,0li $t3,0li $t0,1	#用$t0存储每个月具体的日期,$a0存储这个日期代表星期几addi $t1,$a3,132#用$t1指向基址的所在区域的第三层,开始存放日期mul $t2,$a0,3add $t1,$t1,$t2#使指针指向每个月第一天所在weekday
loop3:	bge $t0,10,ano2#当日期大于十时分类处理blt $a0,7,go_on3	#当一个星期满后开始下一个星期addi $t1,$t1,-21	#指针跳至下一层addi $t1,$t1,66addi $a0,$a0,-7		#开始从星期天循环
go_on3:	addi $t1,$t1,1		#输入日期addi $t3,$t0,48sb $t3,($t1)addi $t1,$t1,2addi $t0,$t0,1addi $a0,$a0,1b loop3			#循环
ano2:	mul $t7,$a2,4	#通过$t6,$t7来获取该月的最大天数la $t6,mondayadd $t7,$t7,$t6lw $t6,($t7)bgt $t0,$t6,out_end#当日期超过最大天数时结束函数blt $a0,7,go_on4	#同上,判断是否满一个星期addi $t1,$t1,-21addi $t1,$t1,66addi $a0,$a0,-7
go_on4:	li $t3,10		#处理大于10的日期div $t0,$t3		#取商为十位,余数为个位放置mflo $t3addi $t3,$t3,48sb $t3,($t1)addi $t1,$t1,1mfhi $t3addi $t3,$t3,48sb $t3,($t1)addi $t1,$t1,2addi $a0,$a0,1addi $t0,$t0,1b loop3			#循环
out_end:move $v0,$a0		#将下个月的第一天的weekday作为参数返回jr $ra

具体的思路是把内存段看成一个二维平面来一个一个放值。

更多推荐

用MIPS写2019年年历

本文发布于:2024-03-10 20:31:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1728961.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:MIPS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!