MIPS用户输入整数到阵列然后打印出来

时间:2013-03-22 00:19:55

标签: arrays assembly mips spim

您好我一直在练习编写汇编语言,我一直在研究这个看似简单的代码。我想提示用户输入然后我想接受该输入并将其放入数组中。然后我想打印出阵列。我知道我可以将它们打印出来而不将它们放在一个数组中,但这只是为了我的练习。虽然它不会打印出来但有些东西是不对的。

    .data
array:  .space 400
prompt: .asciiz "Enter an integer (0 to quit) :"
text:   .asciiz "After sorting, the list of integers is:"
   .text
   .globl main
main:
    la $a1, array

    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall

    sw $v0, 0($a1)
    addiu $a1, $a1, 4

    beqz $v0, sort
    j main

sort:
    la $a1, $array

    li $v0, 4
    la $a0, text
    syscall

loop:
    lw $t0, 0($a1)
    addiu $a1, $a1, 4

    beqz $t0, done

    li $v0, 1
    move $a0, $t0
    syscall

    j loop

done:

请帮助我解决我的错误。哦,当我达到零时意味着它的输入结束

时,零是一种传递值

1 个答案:

答案 0 :(得分:1)

请记住,MIPS上的分支和跳转指令有延迟槽。也就是说,始终执行直接跟随分支或跳转指令的指令 您的汇编程序(气体?)可能会通过插入NOPs或重新排序说明来为您解决此问题。您可以通过使用objdump反汇编二进制文件来找到答案。如果汇编程序没有为您解决此问题,那么自行修复它的最简单方法是在每次分支/跳转后插入NOP

另一个突出的问题是,在您阅读新号码之前,您始终会使用$a1的地址重新加载array。这意味着您读取的每个数字都将存储在array[0],包括终止0.因此,您的打印循环将找到0作为数组中的第一个值并立即退出。
您可以通过将代码更改为以下内容来解决此问题:

main:
la $a1, array
read_numbers:
  # Rest of code omitted for brevity...
  beqz $v0, sort
  j read_numbers