Другие аргументы передаются в стеке:
Память в $sp+16
содержит 5-й аргумент, память в $sp+20
содержит 6-й аргумент и так далее ...
Пример:
; myFunction(1,2,3,4,5,6,7)
addiu $sp, $sp, -28
...
li $a0, 5
sw $a0, 16($sp)
li $a0, 6
sw $a0, 20($sp)
li $a0, 7
sw $a0, 24($sp)
li $a0, 1
li $a1, 2
li $a2, 3
li $a3, 4
jal myFunction
Важно:
Функция C / C ++, имеющая хотя бы один аргумент, может перезаписывать память в $sp+0
. Функция C / C ++, имеющая как минимум два аргумента, может перезаписывать память в $sp+4
и так далее ...
Так что, если вы «просто» вызываете функцию с двумя аргументами следующим образом:
li $a0, 12
li $a1, 34
jal someFunction
... возможно, функция перезапишет ячейки стека $sp+0
... $sp+7
.
Таким образом, даже при вызове функции только с двумя аргументами вы должны гарантировать, что эти местоположения стека могут быть перезаписаны:
addiu $sp, $sp, -8
...
li $a0, 12
li $a1, 34
jal someFunction