2011-02-06 10 views
1

私はwhileループを正しく実装したと思っていましたが、なぜ出力が得られませんか?アセンブリ言語の宿題に問題がある

私の本はあまり役立つものではなく、私はオンラインでリソースを見つけることができませんでした。

##### The Data Segment ######### 

.data 
strFirstNumber:  .asciiz "Enter the first number (0-63): " 
strSecondNumber: .asciiz "Enter the second number (0-63): " 
strError:   .asciiz "That number is not in the 0-63 range.\n\n" 

#### The Text Segment ########## 

.text 
.globl main 

main: 
    li $t2, 0 
#First Number 
    li $10, 64 
    li $v0, 4 
    la $a0, strFirstNumber 
    syscall 
    li $v0, 5 
    syscall 
    blez $v0, in_error 
    bgeu $v0, $10, in_error 
    j DoneIf 

in_error: 
    li $v0, 4 
    la $a0, strError 
    syscall 
    li $v0, 4 
    la $a0, strFirstNumber 
    syscall 
    li $v0, 5 
    syscall 
    bltz $v0, in_error 
    bgeu $v0, $10, in_error 

DoneIf: 
    move $t0, $v0 

#Second Number 
    li $v0, 4 
    la $a0, strSecondNumber 
    syscall 
    li $v0, 5 
    syscall 
    bltz $v0, in_error2 
    bgeu $v0, $10, in_error2 
    j DoneIf2 

in_error2: 
    li $v0, 4 
    la $a0, strError 
    syscall 
    li $v0, 4 
    la $a0, strSecondNumber 
    syscall 
    li $v0, 5 
    syscall 
    blez $v0, in_error2 
    bgeu $v0, $10, in_error2 

DoneIf2: 
    move $t1, $v0 

Loop: 
    beq $t2, $t0, Exit 
    add $t3, $t1, $t1 
    add $t2, $t2, 1 

    j Loop  # go to Loop 

Exit: 
    li $v0, 1 
    add $a0, $0, $t3 
    syscall 

    jr $31 
+0

具体的な問題は何ですか?コードが実際に実行されますか?期待されるプロンプトが表示されますか?それは入力を受け入れますか?次は何が起こる ?あなたはそれをデバッグするために何を試しましたか? –

+0

ありがとうございます。コードが実行され、1番目と2番目の番号を入力できます。しかし、私は結果を表示することはできません。 2番目の数字が入力されても何も表示されません。コードのアイデアは、乗算を模倣するwhileループを実行することです。私はそれを一歩踏み出そうとしましたが、私が間違っていることを理解できません。 – bdmflyer

+0

シングルステッピングの場合、ループにしますか?あなたがそこに着いたら '$ t0'から' $ t3'までの値は何ですか?あなたはこれを 'j Loop'にしたことがありますか?あなたがそこに着くと、レジスタの値は何ですか? –

答えて

1

それは間違っているものを言うことはほぼ不可能です:私たちはのは、システムコールで起こるかわからない

  1. $tレジスタを使用して値を格納しています。これは、MIPSがスクラッチレジスターとしてそれらを定義するので、悪いことです。代わりに$s0$s7を使用してください。
  2. あなたの目標はわかりません。これは本当のHWかエミュレータですか?あなたは正しく、両方の数字を入力した場合

完全なコードはところで、あなたのコードがループに実行する必要があります。私たちが知らない

  • この場合も、syscallがおそらくレジスターをゴミ箱に入れたとすると、それは長い間実行される可能性があります。

    最初にレジスタの割り当てを変更してから、計算結果を変更しないループを削除して$t3にしてください。また、あなたのシステムコールが正しく動作するかどうかを確認することもできます。

  • 0

    これは、プログラムに「システムコール」の処理が記述されていないためです。実際の出力結果はないようです。

    +0

    いくつかの評判を得て、小さな答えにコメントを使用してください。 –

    関連する問題