我试图制作一个输出时间的程序: 00:00:00 一直到 12时59分59秒
这是我的代码,它只绕第二个循环,没有其他东西是输出 它的输出 0:0:0到0:0:59
我做错了什么以及如何以##:##:##
格式获得输出.data
str2: .asciiz ":"
space: .asciiz "\n"
.text
main:
li $t0,1
hour:
bgt $t0,12,exit
minutes:
bgt $t1,59,hour
seconds:
bgt $t2,59,minutes
li $v0, 1
move $a0, $t0
syscall
li $v0,4
la $a0,str2 #load and print string
syscall
li $v0, 1
move $a0, $t1
syscall
li $v0,4
la $a0,str2 #load and print string
syscall
li $v0, 1
move $a0, $t2
syscall
addi $v0, $zero, 4
la $a0, space
syscall
addi $t2,$t2,1
j seconds
addi $t1,$t1,1
j minutes
addi $t0,$t0,1
j hour
exit:
答案 0 :(得分:0)
minutes:
bgt $t1,59,hour ; 1
seconds:
bgt $t2,59,minutes ; 2
li $v0, 1 ; 3
:
addi $t2,$t2,1
j seconds
当$t2
最终到达60
时,您所拥有的代码段将会是一个无限循环。
在代码中没有任何地方你实际上将$t2(secs)
设置回零并递增$t1(mins)
所以,一旦$t2
点击60
并跳转到seconds
,这是执行路径:2, 1, 2, 1, 2, ...
,没有机会再次前进到3
。
至于如何修复它,不要只在minutes
溢出时跳回$t2
,你必须将$t2
设置回零并增加$t1
。 然后您需要检查$t1
是否有溢出等等。
由于它可能是课堂作业,我只会提供伪代码(汇编程序),但是构建代码的最佳方法可能是:
start:
$t0 = 0
$t1 = 0
$t2 = -1
loop:
$t2 = $t2 + 1
if $t2 < 60 goto skipmin
$t2 = 0 ; special when secs -> 60
$t1 = $t1 + 1
skipmin:
if $t1 < 60 goto skiphour
$t1 = 0 ; special when mins -> 60
$t0 = $t0 + 1
if $t0 == 24 goto end ; stop at 24:00:00
skiphour:
display $t0:$t1:$t2
goto loop
end:
stop program
关于如何使用前导零显示值,再次使用伪代码(仅对于秒值,您必须将其展开以处理分钟和小时):
if $t2 > 9 goto nozerosec
syscall 4 with $a0 pointing at "0"
nozerosec:
syscall 1 with $a0 loaded from $t2
这只需检查您要输出的值,如果小于10,则首先输出前导零。
这假设(似乎是)syscall 1用于输出$a0
中的值,而syscall 4用于输出$a0
指向的字符串。
并且,对于额外的学分,你可以使填充输出成为一个单独的函数来调用,而不是在主程序中重复自己。
答案 1 :(得分:0)
您可能希望为分钟小时和秒添加另一个循环,例如:
bgt $t0, 12, exit
bgt $t1, 59, movemin
bgt $t2, 59, movesec
movesec:
addi $t1, $t1, 1
move $t2, $t2, 0
movemin:
addi $t2, $t2, 1
move $t1, $t1, 0
exit:
ori $v0, 0, 10
syscall