2017-01-26 8 views
0

私は最初のAssemblyクラスを受け取り、ユーザーから20個の整数を取得し、配列に格納してさまざまな方法で印刷するプロジェクトを受けました。整数を出力する方法を除いて、私はそのすべてを行うことができました。ここで私はJavaコードで模倣しようとしているものです:MIPSプログラムがブランチステートメントをスキップしているようですか?

int userInput = scannerVariable.nextInt(); 
int count = 0; 
for (int i = 0; i < numbers.length; i++) { 
    System.out.print(numbers[i] + " "); 
    count++; 
    if (count == userInput) { 
    System.out.println(); 
    count = 0; 
    } 
} 

基本的に、私は配列から行ごとに整数のユーザーが指定した金額を印刷する必要があります。

しかし、分岐でアセンブリでこれを実行しようとすると、2番目の分岐ステートメントが "beq $ t3、$ t2、loopF"にスキップされているように見えます。私が取り組んでいることは、以下のAssemblyコードの "loopE"から始まります。どんなフィードバックでも大歓迎です!

コード:

.data 
    array: .space 80 
    newLine: .asciiz "\n" 
    space: .asciiz " " 
    prompt: .asciiz "Enter an integer: " 

.text 
main: li $t0, 20 
     la $t1, array 

# fills array 
loopA: la $a0, prompt 
     li $v0, 4 
     syscall 
     li $v0, 5 
     syscall 
     sw $v0, 0($t1) 
     add $t0, $t0, -1 
     add $t1, $t1, 4 
     bgtz $t0, loopA 

     li $t0, 20 
     la $t1, array 
     la $a0, newLine 
     li $v0, 4 
     syscall 

# prints user specified number of integers per line 
     la $a0, prompt 
     li $v0, 4 
     syscall 
     li $v0, 5 
     syscall 
     move $t2, $v0 
     li $t3, 0 

loopE: lw $a0, 0($t1) 
     li $v0, 1 
     syscall 
     add $t0, $t0, -1 
     add $t1, $t1, 4 
     add $t3, $t3, 1 
     la $a0, space 
     li $v0, 4 
     syscall 
     beq $t3, $t2, loopF 

loopF: la $a0, newLine 
     li $v0, 4 
     syscall 
     li $t3, 0 
     bgtz $t0, loopE 

出力:

Enter an integer: 1 
Enter an integer: 2 
Enter an integer: 3 
Enter an integer: 4 
Enter an integer: 5 
Enter an integer: 6 
Enter an integer: 7 
Enter an integer: 8 
Enter an integer: 9 
Enter an integer: 10 
Enter an integer: 11 
Enter an integer: 12 
Enter an integer: 13 
Enter an integer: 14 
Enter an integer: 15 
Enter an integer: 16 
Enter an integer: 17 
Enter an integer: 18 
Enter an integer: 19 
Enter an integer: 20 

Enter an integer: 5 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

-- program is finished running (dropped off bottom) -- 

出力は次のようになります。

. 
. 
. 
Enter an integer: 5 
1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
+0

'$ t'がcaller-saveであることに加えて、' $ t3'をインクリメントしますが、 '$ t2'を固定しておくと、1回の反復でequalを比較することができます。 –

+1

誰かが火星を修正して、すべてのシステムコールの一部として一時レジスタをすべて破棄するようにしてください! – markgz

答えて

1

べきではない

 beq $t3, $t2, loopF 

ループバックするループ?

 beq $t3, $t2, loopE 

コメントされているように、呼び出されたコードによって保存されたレジスタと呼び出されたコードによって保存される必要がある潜在的な問題もあります。

関連する問題