以 mips 打印循环打印错误的值
Print loop in mips printing wrong values
相当简单的问题。我正在尝试读取一个数组并打印它,但它没有打印它应该打印的内容。
例如。如果我从键盘读取 5 个元素:1、2、3、4、5,打印结果为 5 0 0 0 0。所以我可以理解它从第 5 个元素开始打印,并且它添加了零,因为其余的数组是空的,但我不知道如何修复它。
#bubblesort
.data
array:
.space 100
message1:
.asciiz "Number of elements: "
message2:
.asciiz "The elements:\n"
space:
.asciiz " "
message3:
.asciiz "Result: \n"
.text
main:
li $v0, 4
la $a0, message1
syscall
li $v0, 5
move $t0, $v0
syscall
li $v0, 4
la $a0, message2
syscall
xor $s0, $s0, $s0
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, array
addi $s0, $s0, 1
j readarray
afterread:
xor $s0, $s0, $s0
li $v0, 0
la $t1, array
li $v0, 4
la $a0, message3
syscall
print:
beq $s0, $t0, afterprint
lw $t2, 0($t1)
addi $t1, $t1, 4
li $v0, 1
move $a0, $t2
syscall
li $v0, 4
la $a0, space
syscall
addi $s0, $s0, 1
j print
afterprint:
li $v0, 10
syscall
在您的输入循环中,sw $v0, array
总是存储到数组的第一个元素,覆盖之前的值。
在你的输出循环中,你使用
正确地遍历了数组
lw $t2, 0($t1)
addi $t1, $t1, 4
使用调试器检查内存内容 - 在内存中看到 5 0 0 0 0
会让您马上走上正轨,问题在于将输入存储在第一名。
旁注:不要在 MIPS 上使用异或归零,只能在 x86 上使用。它不保存 space(MIPS 有固定宽度的指令)并且不允许像 move $s0, $zero
那样打破对 $s0
旧值的依赖。 (MIPS 的内存模型保证数据依赖的依赖顺序,如 C++11 std::memory_order_consume
)。
xor $s0, $zero, $zero
可以,尽管不如 addu $s0, $zero, $zero
或 or
惯用。您正在使用其他伪指令,例如 li
和 la
,因此只需使用 move $s0, $zero
。它会 assemble 到 addu
或 or
.
#bubblesort
.data
array:
.space 100
mesaj1:
.asciiz "Numarul de componente: "
mesaj2:
.asciiz "Componentele:\n"
spatiu:
.asciiz " "
mesaj3:
.asciiz "Rezultatul: \n"
.text
main:
li $v0, 4
la $a0, mesaj1
syscall
li $v0, 5
move $t0, $v0
syscall
li $v0, 4
la $a0, mesaj2
syscall
xor $s0, $zero, $zero
li $v0, 0
la $t1, array
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, 0($t1)
addi $t1, $t1, 4
addi $s0, $s0, 1
j readarray
afterread:
xor $s0, $zero, $zero
li $v0, 0
la $t1, array
li $v0, 4
la $a0, mesaj3
syscall
print:
beq $s0, $t0, afterprint
lw $t2, 0($t1)
addi $t1, $t1, 4
li $v0, 1
move $a0, $t2
syscall
li $v0, 4
la $a0, spatiu
syscall
addi $s0, $s0, 1
j print
afterprint:
li $v0, 10
syscall
感谢 Peter Cordes,我找到了解决方案。这是正确的代码。
问题是我没有正确保存数组中的值。
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, array
addi $s0, $s0, 1
j readarray
正确的方法是:
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, 0($t1)
addi $t1, $t1, 4
addi $s0, $s0, 1
j readarray
在$t1la $t1, array
中加载数组的首地址,并在存储从键盘sw $v0, 0($t1)
读取的值后循环addi $t1, $t1, 4
。
谢谢彼得。
相当简单的问题。我正在尝试读取一个数组并打印它,但它没有打印它应该打印的内容。
例如。如果我从键盘读取 5 个元素:1、2、3、4、5,打印结果为 5 0 0 0 0。所以我可以理解它从第 5 个元素开始打印,并且它添加了零,因为其余的数组是空的,但我不知道如何修复它。
#bubblesort
.data
array:
.space 100
message1:
.asciiz "Number of elements: "
message2:
.asciiz "The elements:\n"
space:
.asciiz " "
message3:
.asciiz "Result: \n"
.text
main:
li $v0, 4
la $a0, message1
syscall
li $v0, 5
move $t0, $v0
syscall
li $v0, 4
la $a0, message2
syscall
xor $s0, $s0, $s0
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, array
addi $s0, $s0, 1
j readarray
afterread:
xor $s0, $s0, $s0
li $v0, 0
la $t1, array
li $v0, 4
la $a0, message3
syscall
print:
beq $s0, $t0, afterprint
lw $t2, 0($t1)
addi $t1, $t1, 4
li $v0, 1
move $a0, $t2
syscall
li $v0, 4
la $a0, space
syscall
addi $s0, $s0, 1
j print
afterprint:
li $v0, 10
syscall
在您的输入循环中,sw $v0, array
总是存储到数组的第一个元素,覆盖之前的值。
在你的输出循环中,你使用
正确地遍历了数组 lw $t2, 0($t1)
addi $t1, $t1, 4
使用调试器检查内存内容 - 在内存中看到 5 0 0 0 0
会让您马上走上正轨,问题在于将输入存储在第一名。
旁注:不要在 MIPS 上使用异或归零,只能在 x86 上使用。它不保存 space(MIPS 有固定宽度的指令)并且不允许像 move $s0, $zero
那样打破对 $s0
旧值的依赖。 (MIPS 的内存模型保证数据依赖的依赖顺序,如 C++11 std::memory_order_consume
)。
xor $s0, $zero, $zero
可以,尽管不如 addu $s0, $zero, $zero
或 or
惯用。您正在使用其他伪指令,例如 li
和 la
,因此只需使用 move $s0, $zero
。它会 assemble 到 addu
或 or
.
#bubblesort
.data
array:
.space 100
mesaj1:
.asciiz "Numarul de componente: "
mesaj2:
.asciiz "Componentele:\n"
spatiu:
.asciiz " "
mesaj3:
.asciiz "Rezultatul: \n"
.text
main:
li $v0, 4
la $a0, mesaj1
syscall
li $v0, 5
move $t0, $v0
syscall
li $v0, 4
la $a0, mesaj2
syscall
xor $s0, $zero, $zero
li $v0, 0
la $t1, array
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, 0($t1)
addi $t1, $t1, 4
addi $s0, $s0, 1
j readarray
afterread:
xor $s0, $zero, $zero
li $v0, 0
la $t1, array
li $v0, 4
la $a0, mesaj3
syscall
print:
beq $s0, $t0, afterprint
lw $t2, 0($t1)
addi $t1, $t1, 4
li $v0, 1
move $a0, $t2
syscall
li $v0, 4
la $a0, spatiu
syscall
addi $s0, $s0, 1
j print
afterprint:
li $v0, 10
syscall
感谢 Peter Cordes,我找到了解决方案。这是正确的代码。 问题是我没有正确保存数组中的值。
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, array
addi $s0, $s0, 1
j readarray
正确的方法是:
readarray:
beq $s0, $t0, afterread
li $v0, 5
syscall
sw $v0, 0($t1)
addi $t1, $t1, 4
addi $s0, $s0, 1
j readarray
在$t1la $t1, array
中加载数组的首地址,并在存储从键盘sw $v0, 0($t1)
读取的值后循环addi $t1, $t1, 4
。
谢谢彼得。