0

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

    .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:

请帮我解决我做错的事情。哦,当我击中零时,零是一种标记值,这意味着它的输入结束

4

1 回答 1

1

请记住,MIPS 上的分支和跳转指令具有延迟槽。也就是说,总是执行直接跟在分支或跳转指令之后的指令。
您的组装人员(gas?)可能会通过插入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
于 2013-03-22T06:27:26.330 回答