Как добавить более 4 аргументов для функции в MIPS?

Итак, я должен перевести этот код C ++

funcArr2 (12, a2, a3, a4, used1, used2, &used3, &used4);

и я до сих пор был в состоянии перевести a1-a4 с

        li $a0, 12
addi $a1, $sp, 280
addi $a2, $sp, 328
addi $a3, $sp, 376
**missing code for arguments 5-8**
jal funcArr2

Тем не менее, я совершенно не знаю, как продолжить добавление других аргументов, я смутно помню, как нужно было сохранить его в стеке, но я не помню код, чтобы это сделать.

0

Решение

Тебе повезло, Рэймонд Чен недавно писал в блоге (по крайней мере, для NT) и освещает эту тему в некоторых деталях.

В некоторых соглашениях о вызовах MIPS, по крайней мере, в Linux и NT, функции всегда получают 16 байт «домашнего пространства» в стеке, даже если они принимают менее 4 аргументов регистра. 5-е и последующие целочисленные аргументы идут выше, в стеке.

2

Другие решения

Другие аргументы передаются в стеке:

Память в $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
0

По вопросам рекламы [email protected]