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 未満の場合は先頭に 0 を出力するだけで機能します。

$a0これは、syscall 1 が の値を出力するためのものであり、syscall 4 が が指す文字列を出力するためのものであると想定しています (そのように思われます) $a0

また、クレジットを追加するために、パディングされた出力を、メイン プログラムで繰り返すのではなく、呼び出される別の関数にすることができます。

于 2014-11-12T01:34:17.760 に答える