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

时间:2014-11-12 01:28:25

标签: 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:
         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:

2 个答案:

答案 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