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
'$ t'がcaller-saveであることに加えて、' $ t3'をインクリメントしますが、 '$ t2'を固定しておくと、1回の反復でequalを比較することができます。 –
誰かが火星を修正して、すべてのシステムコールの一部として一時レジスタをすべて破棄するようにしてください! – markgz