#mips32
#mips32
Вопрос:
я хочу передать список функции в mips, чтобы я мог что-то делать с этим lsit’ом, но мое назначение запрещает инструкцию move,
пытался передать адрес, но все они выдают ошибку
addi $fp, $sp, 0
addi $sp, $sp, -4
la $t0, thelist
sw $t0, ($sp)
jal bubblesort
bubblesort:
#call function
addi $sp, $sp, -8 #push 8 bytes to store $fp and $ra
sw $ra, 4($sp)
sw $fp, ($sp)
#copy $sp to $fp
addi $fp, $sp, 0
#allocate local variable
addi $sp, $sp, -16 #i, j, listaddress, size
#initialize i j n
lw $t0, 8($fp)
sw $t0, -12($fp) # listaddress
lw $t1, size
sw $0, -8($fp) #i = 0
sw $0, -4($fp) #j = 0
loop1:
#condition
lw $t0, -8($fp) #load i
lw $t1, size #the actual n
addi $t1, $t1, -1 #n = n - 1
beq $t0, $t1, end #if i == n-1, jump to end
loop2:
lw $t0, -4($fp) #load j
lw $t1, size #load n
addi $t1, $t1, -1 #n = n - 1
beq $t0, $t1, exit1 #if j == n-1, jump to exit1
#swap section
lw $t1, thelist #$t1 = list address
sll $t0, $t0, 2 #j = j*4
add $t3, $t1, $t0 #address of list[j]
lw $t4, ($t3) #list[j]
lw $t5, 4($t3) #list[j 1]
slt $t2, $t5, $t4
beq $t2, $0, exit2 #if list[j] < list[j 1], jump to loop2
#swap
add $t2, $t5, 0 #temp = list[j 1]
add $t5, $t4, 0 #list[j 1] = list[j]
add $t4, $t2, 0 #list[j] = temp
sw $t5, ($t3)
sw $t6, 4($t3)
lw $t0, -4($fp)
addi $t0, $t0, 1 #j = j 1
sw $t0, -4($fp)
j loop2
exit2:
lw $t0, -4($fp)
addi $t0, $t0, 1 #j = j 1
sw $t0, -4($fp)
j loop2
exit1:
lw $t0, -8($fp)
addi $t0, $t0, 1
sw $t0, -8($fp)
j loop1
end:
lw $v0, -12($fp)
addi $sp, $sp 12
lw $fp, ($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
jr $ra
Ответ №1:
На самом деле вы можете получить доступ к регистрам $ t внутри ваших функций. Нет необходимости сохранять его в стеке раньше. Например, если вы загрузите свой список в $ t10, вы можете легко получить к нему доступ внутри своей функции. Также: Вместо move вы всегда можете использовать add. Я не могу запустить ваш код, поскольку это неполный пример. Как хранится ваш список?