使用mips中的嵌套循环刺激时钟

使用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:

我试图制作一个输出时间如下的程序: 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:
当$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