我的作业是在MIPS中编写梳子排序。用户将进入阵列,当然还有它的大小。当serach进行堆分配时,我发现系统调用了9,但是我找不到使用它的方法。我写这个:
li $v0, 4
la $a0, message1 # prints the first message
syscall
li $v0, 5 # reads the size for the array
syscall
mul $t0, $v0, 4 # because array contains integer, I change them into bytes
la $a0, $t0 # allocate the size of the array in the heap
li $v0, 9 # now, $v0 has the address of allocated memory
syscall
move $v1, $v0 # Because systemcall uses $vo register, I move it to $v1 keep it safe.
create_array:
la $a0, message2 # prints the first message
li $v0, 4
syscall
li $s0, 0 # $s1 is the index, and loop induction variable
li $s1, 5 # $s1 is the sentinel value for the loop
Loop1: bge $s0, $s1, End_Loop1
li $v0, 5 # Read integer values
syscall
mul $t3, $s0, 4 # $t3 is the offset
add $t4, $t3, $t0 # $t4 is the address of desired index
sw $v0, ($t4) # store the value in the array
addi $s0, $s0, 1 # increment the index
j Loop1
End_Loop1:
我得到了这个错误; la“:操作数太少或格式不正确。预计:la $ t1,($ t2)
我该如何使用它?这是创建数组的正确方法吗?
谢谢。
答案 0 :(得分:1)
替换
la $a0, $t0 # allocate the size of the array in the heap
与
move $a0, $t0
la
指令的目的是[L]将符号的[A]地址放入寄存器中。例如:
la $a0, message1 # prints the first message
会将message1
的地址加载到注册表$a0
中。 la
实际上是伪指令,在这种情况下转换为:
lui $a0, message1/0x10000 # load the upper halfword of the address
ori $a0, $a0, message1%0x10000 # OR in the lower halfword of the address
你可以想象,尝试加载另一个寄存器的地址是没有意义的,因为寄存器没有地址。
虽然我们讨论的是MIPS伪指令:move
也是其中之一,上面的move $a0, $t0
指令转换为类似add $a0, $0, $t0
的内容。
答案 1 :(得分:0)
此外,将 $ t0 替换为 $ v1 。 $ t0仅保留分配在堆中的总字节,但是您需要$ v1,这是堆中数组的起始地址。 应该是这样的:
add $t4, $t3, $v1 # $t4 is the address of desired index