MIPS程序似乎正在跳过分支声明?

时间:2017-01-26 07:22:30

标签: assembly branch mips mars-simulator

所以我接受了我的第一个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

1 个答案:

答案 0 :(得分:1)

不应该

       beq $t3, $t2, loopF

循环回到loopE?

       beq $t3, $t2, loopE

如评论所述,调用代码与被调用代码保存的寄存器之间也需要保存寄存器的潜在问题。

相关问题