所以我接受了我的第一个Assembly类,我得到了一个项目,我们从用户那里得到20个整数并将它们存储到一个数组中并以各种方式打印它们。除了打印整数的一种方法之外,我能够做到这一切。以下是我试图在Java代码中模仿的内容:
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;
}
}
基本上,我需要从数组中每行打印一个用户指定的整数。
但是,当我尝试在使用分支的Assembly中执行此操作时,似乎跳过了第二个分支语句,即“beq $ t3,$ t2,loopF”。我正在考虑的是从下面汇编代码中的“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 :(得分:1)
不应该
beq $t3, $t2, loopF
循环回到loopE?
beq $t3, $t2, loopE
如评论所述,调用代码与被调用代码保存的寄存器之间也需要保存寄存器的潜在问题。