使用mips中的嵌套循环刺激时钟
我试图制作一个输出时间如下的程序: 00:00:00 一直到 12:59:59 这是我的代码,它只在第二个循环,没有其他输出 它的输出来自 0:0:0至0:0:59 我做错了什么?如何以以下格式获得输出:使用mips中的嵌套循环刺激时钟,mips,mips32,mars-simulator,Mips,Mips32,Mars Simulator,我试图制作一个输出时间如下的程序: 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:
.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:
当$t2最终达到60时,您的代码段将是一个无限循环
代码中没有任何地方实际将$t2secs设置回零并增加$t1mins,因此,一旦$t2达到60并跳到秒,以下是执行路径:2,1,2,1,2,…,没有机会再次前进到3
至于如何修复它,当$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
这只需检查要输出的值,如果值小于10,则首先输出前导零即可
这是假设的,因为似乎syscall 1用于输出$a0中的值,syscall 4用于输出由$a0指向的字符串
而且,对于额外的积分,您可以将填充输出作为单独的函数来调用,而不是在主程序中重复自己的操作。您可能需要为分、小时和秒添加另一个循环,例如:
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
if $t2 > 9 goto nozerosec
syscall 4 with $a0 pointing at "0"
nozerosec:
syscall 1 with $a0 loaded from $t2
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