Assembly 此代码不会在Qtspim上运行

Assembly 此代码不会在Qtspim上运行,assembly,mips,heapsort,Assembly,Mips,Heapsort,这是heapsort的mips代码。当我尝试运行它时,会收到以下错误消息 第149行出现语法错误(数组:。单词54,23,56,32,99,7,4,2,88,9,11,21,39,55100101,43,1,3,69,-5,-24,-17,0) 以及第14行上的另一个指令参考未定义符号。 我已经看了很多遍了,我仍然没有看到任何错误。如果你发现了,请告诉我。 代码如下: .text .globl main main: la $a0, array # a0 = &array la

这是heapsort的mips代码。当我尝试运行它时,会收到以下错误消息 第149行出现语法错误(数组:。单词54,23,56,32,99,7,4,2,88,9,11,21,39,55100101,43,1,3,69,-5,-24,-17,0) 以及第14行上的另一个指令参考未定义符号。 我已经看了很多遍了,我仍然没有看到任何错误。如果你发现了,请告诉我。 代码如下:

.text
.globl main
main:

  la $a0, array # a0 = &array

  la $t0, size
  lw $a1, 0($t0) # a1 = size(array)

  jal heapsort

  # print the array
  move $t0, $a0
  add $t1, $zero, $zero
printloop:
  li $v0, 1
  lw $a0, 0($t0)
  addi $t0, $t0, 4
  addi $t1, $t1, 1
  syscall
  li $v0, 4
  la $a0, space 
  syscall

  bne $t1, $a1, printloop   # while( t1 != size )
  li $v0, 4
  la $a0, newline
  syscall

done:
  jr $ra

heapsort: # a0 = &array, a1 = size(array)
  addi $sp, $sp, -8
  sw $a1, 0($sp)  # save size
  sw $a2, 4($sp)  # save a2
  sw $ra, 8($sp)  # save return address


  move $a2, $a1  # n will be stored in a2
  addi $a2, $a2, -1    # n = size - 1
  ble $a2,$zero, end_heapsort  # if (n <= 0 ) return;

  jal make_heap  # a0 = arr, a1 = size

  add $a1, $zero, $zero # clear $a1
heapsort_loop:
  # swap(array[0],array[n])
  lw $t0, 0($a0)
  sll $t1, $a2, 2  #t1 = bytes(n)
  add $t1, $t1, $a0
  lw $t2, 0($t1)
  sw $t0, 0($t1)
  sw $t2, 0($a0)

  addi $a2, $a2, -1 # n--
  jal bubble_down  # a0 = &array, a1 = 0, a2 = n

  bnez $a2, heapsort_loop
end_heapsort:
  lw $ra, 8($sp)
  lw $a2, 4($sp)
  lw $a1, 0($sp)
  addi $sp, $sp, 8
  jr $ra

make_heap: # a0 = &array, a1 = size
  addi $sp, $sp, -12
  sw $a1, 0($sp)
  sw $a2, 4($sp)
  sw $ra, 8($sp)

  addi $a2, $a1, -1  # a2 = size - 1

  addi $a1, $a1, -1  # start_index = size - 1
  srl $a1, $a1, 1  # start_index /= 2

  blt $a1, $zero, end_make_heap  # if(start_index < 0) return

make_heap_loop:
  jal bubble_down # a0 = &array, a1 = start_index, a2 = size-1
  addi $a1, $a1, -1
  ble $zero, $a1, make_heap_loop

end_make_heap:
  lw $ra, 8($sp)
  lw $a2, 4($sp)
  lw $a1, 0($sp)
  addi $sp, $sp, 12
  jr $ra

#bubble_down is a leaf in the call graph
bubble_down: # a0 = &array, a1 = s_idx, a2 = end
  move $t0, $a1  # index = s_idx
  sll $t1, $t0, 2  # child = index*2+1
  addi $t1, $t1, 1

  bgt $t1, $a2, end_bubble_down

bubble_down_loop:

  #if ( child < end && arr[child] < arr[child+1] )
  ble $a2, $t1, skipinc
  sll $t3, $t1, 2  # get bytes(child)
  add $t3, $t3, $a0
  lw $t3, 0($t3)  # t3 = arr[child]
  sll $t4, $t1, 2 #get bytes(child)
  addi $t4, $t4, 4 #t4 = bytes(child+1)
  add $t4, $t4, $a0
  lw $t4, 0($t4)  #t4 = arr[child+1]
  ble $t4, $t3, skipinc

  addi $t1, $t1, 1  # child++

skipinc:
  sll $t3, $t0, 2  # get bytes(index)
  add $t3, $t3, $a0
  lw $t4, 0($t3)  #t4 = arr[index], t3 = &arr[index]

  sll $t5, $t1, 2  # get bytes(child)
  add $t5, $t5, $a0
  lw $t6, 0($t5)  #t6 = arr[child], t5 = &arr[child]

  ble $t6, $t4, end_bubble_down

  # swap(arr[index],arr[child]
  # note: t4 = arr[index], t6 = arr[child], t3 = &arr[index], t5 = &arr[child]
  sw $t4, 0($t5)
  sw $t6, 0($t3)

  move $t0, $t1  # index = child

  sll $t1, $t0, 1  # child = index*2+1
  addi $t1, $t1, 1
  ble $t1, $a2, bubble_down_loop

end_bubble_down:
  jr $ra

.data
# the array that holds unordered data
array: .word 54,23,56,32,99,7,4,2,88,9,11,21,39,55,100,101,43,1,3,69,-5,-24,-17,0
size: .word 24
space: .asciiz " "
newline: .asciiz "\n"
.text
格洛博梅因酒店
主要内容:
la$a0,数组#a0=&数组
la$t0,尺码
lw$a1,0($t0)#a1=大小(数组)
日航希普索尔机场
#打印阵列
移动$t0,$a0
加上$t1、$0、$0
打印循环:
李$v0,1
lw$a0,0($t0)
addi$t0,$t0,4
附加$t1,$t1,1
系统调用
李$v0,4
洛杉矶$a0,空间
系统调用
bne$t1,$a1,printloop#while(t1!=大小)
李$v0,4
洛杉矶$a0,新线
系统调用
完成:
jr$ra
heapsort:#a0=数组,a1=大小(数组)
附加$sp,$sp,-8
sw$a1,0($sp)#节省尺寸
sw$a2,4($sp)#节省a2
sw$ra,8($sp)#保存回信地址
移动$a2,$a1#n将存储在a2中
addi$a2,$a2,-1#n=尺寸-1

ble$a2,$zero,end_heapsort#if(n我无法重现您在Windows的QtSpim 9.1.12中描述的错误。因此,您要么使用行为不同的不同版本的QtSpim,要么没有运行您向我们展示的确切代码,要么在重新加载汇编代码之前没有重新初始化模拟器

但是,您的代码中确实存在一个bug。可能不止一个,但至少有一个是显而易见的:

done:
你试图用
jr$ra
结束你的程序。但是,你在
jal heapsort
更改了
$ra
的值,但没有保留它。所以在最后一次
jr$ra
发生的事情是,你将跳回打印代码,然后再次执行。你要做的第一件事是
$t0=$a0
,其中
$a0
应该包含
数组的地址
。但是
$a0
不再包含数组的地址,因为就在
jr$ra
之前,您做了
la$a0,newline


TL;DR:无论何时执行
jal
操作,您都在修改
$ra
。如果您需要在以后某个时间使用
$ra
的先前值,则需要保留它(在另一个寄存器、内存变量或堆栈中).

我无法重现您在QtSpim 9.1.12 for Windows中描述的错误。因此,您使用的QtSpim的不同版本表现不同,和/或没有运行您向我们展示的确切代码,和/或在重新加载汇编代码之前没有重新初始化模拟器

但是,您的代码中确实存在一个bug。可能不止一个,但至少有一个是显而易见的:

done:
你试图用
jr$ra
结束你的程序。但是,你在
jal heapsort
更改了
$ra
的值,但没有保留它。所以在最后一次
jr$ra
发生的事情是,你将跳回打印代码,然后再次执行。你要做的第一件事是
$t0=$a0
,其中
$a0
应该包含
数组的地址
。但是
$a0
不再包含数组的地址,因为就在
jr$ra
之前,您做了
la$a0,newline


TL;DR:无论何时执行
jal
操作,您都在修改
$ra
。如果以后需要
$ra
的前一个值,您需要将其保留(在另一个寄存器、内存变量或堆栈中)。

可以通过在数组中的每个“,”后面加一个空格来修复语法错误。单词:
因此,“54,23,56,32,99,7,4,2,…”

可以通过在数组中的每个“,”后面加空格来修复语法错误。单词:

所以“54,23,56,32,99,7,4,2,…”

也许它不知道
$0
,试着用
$0
代替。至于另一个错误,如果它真的在那一行(你粘贴的只有146行)
array
可能是保留字,请尝试使用其他字。谢谢,我会进行更改。希望它能运行。Ohhh仍然有相同的消息。似乎没有更改。有什么想法吗???请验证这是您的实际代码以及错误所在。正如我所说,甚至没有第149行。语法错误指向lin上的字下方e in.data,array:.word 54,23,56,32…)可能它不知道
$0
,请尝试使用
$0
。至于另一个错误,如果它真的在那一行上(你粘贴的只有146行)
array
可能是保留字,请尝试使用其他错误。谢谢,我将进行这些更改。希望它运行。哦,仍然有相同的信息。似乎没有什么变化。有什么想法吗???请确认这是你的代码,错误在哪里。正如我所说,甚至没有第149行。语法错误点在.data,array.中的word行下面。word 54,23,56,32…)谢谢。我没看到。肯定会这样做,我希望这次代码可以运行。:)你好。我做了些改变,我很确定这是正确的改变。(谢谢)但当我尝试在0x0040002c[0x0040002c]0x3c010000 lui$1,0[size]处运行代码“指令引用未定义符号”时,仍然会收到此错误消息;14:la$t0,大小。你能告诉我这是什么意思吗。我已经看了一遍又一遍,但我不知道问题出在哪里。谢谢你或任何其他人。确保你有大小:.word 24在你的.data部分。谢谢。我真的很感激它。谢谢。汉克斯。没有看到。我肯定会这样做,我希望这次代码能运行。:)你好。我进行了更改,我非常确定这是正确的更改。(谢谢),但当我尝试在0x0040002c[0x0040002c]0x3c010000 lui$1,0[size]处运行代码“指令引用未定义符号”时,仍然会收到此错误消息;14:la$t0,尺码。你能告诉我那是什么意思吗。