您好我一直在练习编写汇编语言,我一直在研究这个看似简单的代码。我想提示用户输入然后我想接受该输入并将其放入数组中。然后我想打印出阵列。我知道我可以将它们打印出来而不将它们放在一个数组中,但这只是为了我的练习。虽然它不会打印出来但有些东西是不对的。
.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:
请帮助我解决我的错误。哦,当我达到零时意味着它的输入结束
时,零是一种传递值答案 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