【问题标题】:MIPS User input integers into array then printing them outMIPS 用户将整数输入数组然后打印出来
【发布时间】:2013-03-22 00:19:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: arrays assembly mips spim


    【解决方案1】:

    请记住,MIPS 上的分支和跳转指令有延迟槽。也就是说,总是执行直接跟在分支或跳转指令之后的指令。
    您的组装人员(gas?)可能会通过插入NOPs 或重新订购说明来为您解决这个问题。您可以通过使用 objdump 反汇编二进制文件来找出答案。如果汇编器没有为您解决这个问题,最简单的自行解决方法是在每个分支/跳转后插入 NOP

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

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

    【讨论】:

    • 谢谢!这是在循环中加载地址的简单错误。我什至没有意识到我正在这样做。我很感激。
    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多