如何在MIPS中使用系统调用9

时间:2013-03-28 19:55:37

标签: sorting mips

我的作业是在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)

我该如何使用它?这是创建数组的正确方法吗?

谢谢。

2 个答案:

答案 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