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 a0) #存字节
addi a0,1 #地址下一位
addi 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 t0 #i/3
mflo $v0 #存商
mfhi $v1 #存余数
mul v0,544
mul v1,21
addu s2,$t1
addu s2,$t2
beqz $v1,jump #判断月份模块前是否需要加两个空白列
mul v1,2
add s2,$v1 #确定起始位置
jump: jal month
addi s1,1 #月份加一
blt $s1,12,loop2 #循环
li $t0,67
la $a0,calender
add a0,$t0
li $t1,10
loop3: sb a0)
addi t0,68
addi 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 s1,3
la $t6,monthname #加载monthname的地址
add t6,$t1 #确定要取得月份名位置
addi s2,7 #确定要存的位置
lb t6) #取字符
sb t7) #存字符
addi t6,1
addi t7,1
lb t6)
sb t7)
addi t6,1
addi t7,1
lb t6)
sb t7) #重复操作,存入月份名
addi s2,68 #重启一行,进入星期名
li $t0,0 #循环计数器
la $t6,weekname #加载weekname的地址
loop4: lb t6) #取字符
sb t7) #存字符
addi t6,1
addi t7,1
addi t0,1 #计数器+1
blt $t0,21,loop4 #循环
addi s2,136
rem s0,7
mul t1,3
addu t7,$t1 #确定每月一号的位置
la $a1,mon
mul s1,4
addu a1,$t1
lw a1) #用$t3存储每个月的实际天数
la $t6,dayname #加载dayname的地址
loop5: lb t6) #取字符
sb t7) #存字符
addi t6,1
addi t7,1
lb t6)
sb t7)
addi t6,1
addi t7,1 #重复操作
addi t7,1 #日期间的空列
addi s0,1 #星期+1
blt $s0,7,continue
bge $s0,7,continue1
continue1: bgt $s0,7,continue2
addi t7,47
b continue
continue2: li $s0,1
b continue
continue: addi t5,-1
bgtz $t5,loop5
jr $ra
实验结果: