Disclaimer: je ne connais pas les MIPS.
Mais je ne vois pas où est la difficulté en fait. En suivant la convention du document, qui est d'empiler également le contenu de $a0-$a3, pour:
sprintf(dest, "%d %d %d %d", u, v, w, x);
- dest sera dans le registre $a0 (et dans 0($sp) ),
- la chaine format sera dans $a1 (et dans 4($sp) ),
- u dans $a2 (et dans 8($sp) ),
- v sera dans $a3 (et dans 12($sp) ),
- w sera dans 16($sp) à l'entrée dans la fonction
- x sera dans 20($sp) à l'entrée dans la fonction
Donc tu n'as qu'à faire une boucle et ajouter +4 à $sp pour récupérer argument après argument (en commençant à !($sp) pour les arguments facultatifs).
En effet, le premier argument est posté dans l'emplacement le plus bas (en terme d'addresse mémoire), et le dernier est posté dans l'emplacement le plus haut. C'est l'inverse du sens de progression de la pile d'ailleurs (elle progresse dans l'ordre décroissant des adresses mémoires).