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
实验结果: