[MIPS] Recoder sprintf

Recoder sprintf [MIPS] - ASM - Programmation

Marsh Posté le 02-12-2004 à 17:20:13    

Bon voila j'ai pour projet le recodage de sprintf en MIPS (à peu pres ca http://www-inst.eecs.berkeley.edu/~cs61c/hw/proj2/)
 
Mais je me demande qqchose. Dans l'exemple ils empilent d'abord le buffer de sortie puis la chaine formatée et pour finir les valeurs correspondant.
 
Mais j'ai un souci. Comment savoir combien d'arguments il y a si la chaine a été empilée avant les arguments (dont le nombre est variable).
Si la chaine été empilée en dernier on pourrait compter les % et ainsi dépiler le bon nombre de valeurs mais la ...

Reply

Marsh Posté le 02-12-2004 à 17:20:13   

Reply

Marsh Posté le 03-12-2004 à 07:38:34    

personne n'a d'indication ? Je sais que pas mal ici préfèrent le x86 mais bon ma question n'est pas spécifique à MIPS

Reply

Marsh Posté le 03-12-2004 à 10:53:20    

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).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed