Как добавить более 4 аргументов для функции в MIPS? - PullRequest
0 голосов
/ 25 апреля 2018

Хорошо, я должен перевести этот код 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

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

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

Память в $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 голосов
/ 25 апреля 2018

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

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

...