MIPS程序设计实验:万年历

MIPS程序设计实验:万年历

设计思路:
将日历看做是一个二维平面,建立一个一维数组,在合适的位置断开,将其分割成一个坐标图。将一个月建立为month函数,循环调用。事先存储每个月的天数与2019年1月1日的星期数。每个月份先确定每月月份名、星期表头和1号的位置,然后在不同的坐标位置按序填入相关的信息,每一行坐标结尾添加一个换行符。最后将整个一维数组输出。
流程图:
在这里插入图片描述

代码:
#############################################主程序头示例#########################################################################

#程序整体描述
##################################################################################################################################
#寄存器使用:
#KaTeX parse error: Expected 'EOF', got '#' at position 12: s0 : 初始化星期 #̲s1 : 记录月份
#KaTeX parse error: Expected 'EOF', got '#' at position 14: s2 : 记录日历的地址 #̲t0 : 循环计数器和计算过渡
#$t1: 加载字符
##################################################################################################################################
.data
mon: .word 31,28,31,30,31,30,31,31,30,31,30,31
.align 0
monthname: .asciiz "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC "
weekname: .asciiz " S M T W T F S "
dayname: .asciiz " 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031 "
calender: .space 2176
.globl main
.text
main: li KaTeX parse error: Expected 'EOF', got '#' at position 6: s0,2 #̲s0为星期数的记录
##################
li KaTeX parse error: Expected 'EOF', got '#' at position 6: t0,0 #̲t0用作循环计数器
li KaTeX parse error: Expected 'EOF', got '#' at position 7: t1,32 #̲在t1中载入
la KaTeX parse error: Expected 'EOF', got '#' at position 13: a0,calender #̲在a0中载入calender的地址
loop1: sb t 1 , ( t1,( t1,(a0) #存字节
addi a 0 , a0, a0,a0,1 #地址下一位
addi t 0 , t0, t0,t0,1 #计数器加一
blt $t0,2176,loop1 #循环
li $s1,0 #载入月份
loop2: la KaTeX parse error: Expected 'EOF', got '#' at position 13: s2,calender #̲用s2记录开始位置
li $t0,3
div s 1 , s1, s1,t0 #i/3
mflo $v0 #存商
mfhi $v1 #存余数
mul t 1 , t1, t1,v0,544
mul t 2 , t2, t2,v1,21
addu s 2 , s2, s2,s2,$t1
addu s 2 , s2, s2,s2,$t2
beqz $v1,jump #判断月份模块前是否需要加两个空白列
mul v 1 , v1, v1,v1,2
add s 2 , s2, s2,s2,$v1 #确定起始位置
jump: jal month
addi s 1 , s1, s1,s1,1 #月份加一
blt $s1,12,loop2 #循环
li $t0,67
la $a0,calender
add a 0 , a0, a0,a0,$t0
li $t1,10
loop3: sb t 1 , ( t1,( t1,(a0)
addi t 0 , t0, t0,t0,68
addi a 0 , a0, a0,a0,68
blt $t0,2176,loop3

cout: la $a0,calender
li $v0,4
syscall
li KaTeX parse error: Expected 'EOF', got '#' at position 17: …0,10 syscall #̲###############…t0 : 循环计数器
#KaTeX parse error: Expected 'EOF', got '#' at position 12: t1 : 计算的过渡 #̲t3 : 存放取出的字符
#KaTeX parse error: Expected 'EOF', got '#' at position 12: t5 : 每月的天数 #̲t6 : 记录取字符时的地址
#$t7 : 记录calender中所要存字符的地址
#################################################################################################################################
month: mul t 1 , t1, t1,s1,3
la $t6,monthname #加载monthname的地址
add t 6 , t6, t6,t6,$t1 #确定要取得月份名位置
addi t 7 , t7, t7,s2,7 #确定要存的位置
lb t 3 , ( t3,( t3,(t6) #取字符
sb t 3 , ( t3,( t3,(t7) #存字符
addi t 6 , t6, t6,t6,1
addi t 7 , t7, t7,t7,1
lb t 3 , ( t3,( t3,(t6)
sb t 3 , ( t3,( t3,(t7)
addi t 6 , t6, t6,t6,1
addi t 7 , t7, t7,t7,1
lb t 3 , ( t3,( t3,(t6)
sb t 3 , ( t3,( t3,(t7) #重复操作,存入月份名
addi t 7 , t7, t7,s2,68 #重启一行,进入星期名
li $t0,0 #循环计数器
la $t6,weekname #加载weekname的地址
loop4: lb t 3 , ( t3,( t3,(t6) #取字符
sb t 3 , ( t3,( t3,(t7) #存字符
addi t 6 , t6, t6,t6,1
addi t 7 , t7, t7,t7,1
addi t 0 , t0, t0,t0,1 #计数器+1
blt $t0,21,loop4 #循环
addi t 7 , t7, t7,s2,136
rem t 1 , t1, t1,s0,7
mul t 1 , t1, t1,t1,3
addu t 7 , t7, t7,t7,$t1 #确定每月一号的位置
la $a1,mon
mul t 1 , t1, t1,s1,4
addu a 1 , a1, a1,a1,$t1
lw t 5 , ( t5,( t5,(a1) #用$t3存储每个月的实际天数
la $t6,dayname #加载dayname的地址
loop5: lb t 3 , ( t3,( t3,(t6) #取字符
sb t 3 , ( t3,( t3,(t7) #存字符
addi t 6 , t6, t6,t6,1
addi t 7 , t7, t7,t7,1
lb t 3 , ( t3,( t3,(t6)
sb t 3 , ( t3,( t3,(t7)
addi t 6 , t6, t6,t6,1
addi t 7 , t7, t7,t7,1 #重复操作
addi t 7 , t7, t7,t7,1 #日期间的空列
addi s 0 , s0, s0,s0,1 #星期+1
blt $s0,7,continue
bge $s0,7,continue1
continue1: bgt $s0,7,continue2
addi t 7 , t7, t7,t7,47
b continue
continue2: li $s0,1
b continue
continue: addi t 5 , t5, t5,t5,-1
bgtz $t5,loop5
jr $ra
实验结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值