0

我试图制作一个像这样输出时间的程序: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:
4

2 回答 2

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,则首先输出前导零。

这是假设(似乎是)系统调用 1 用于输出值,$a0系统调用 4 用于输出指向的字符串$a0

而且,为了获得额外的积分,您可以将填充的输出设置为一个单独的函数来调用,而不是在主程序中重复自己。

于 2014-11-12T01:34:17.760 回答
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
于 2015-12-09T15:38:07.327 回答