Assembly, arguments multiples -m32 / linux (identique à stdarg en C)

Pour résoudre ce problème, je comprends C et je suis toujours un débutant en Assemblée, alors je suis un peu coincé avec un petit problème ici.

J’ai quelques difficultés à prendre plusieurs arguments, peut-être les compter si je devais le faire, et utiliser les arguments de format dans mon code d’assembly.

Essayer d’append des octets à une chaîne avec plusieurs arguments. Je sais comment mettre les deux premiers arguments sur la stack, mais les autres arguments après le premier sont le format (comme% s,% d,% c, etc.) et le premier argument est celui qui est supposé être la variable i. vouloir écrire à. En C, le principal standard a argument-counter. Je pourrais aussi compter les arguments ici aussi!? Comment puis-je faire cela, si c’est comme ça?

.globl minisprintf # Name: minisprintf # Synopsis: A simplified sprintf # C-signature: int minisprintf(unsigned char *res, unsigned char *format, ...); # Registers: AL: for characters # %ECX: first argument, res # %EDX: second argument, args # minisprintf: # minisprintf pushl %ebp # start of movl %esp, %ebp # function movl 8(%ebp), %ecx # first argument movl 12(%ebp), %edx # second argument # other arguments # checking last byte of ssortingng res 

Les fonctions variées étant une fonctionnalité C, le mieux serait de vérifier comment une implémentation open source de va_start , va_arg et va_end pour l’architecture / ABI qui vous intéresse.

Vous n’avez pas besoin d’un nombre d’arguments explicites pour une fonction semblable à printf , car ces informations sont intégrées à la chaîne de format. Le nombre et les types d’arguments variadiques à attendre sont donnés par le nombre et les détails des spécificateurs de format.

Pour que tout cela fonctionne correctement, vous devez comprendre les aspects relatifs aux procédures d’appel de votre ABI. Par exemple, les arguments de nombre à virgule flottante et d’entier vont-ils dans la même stack ou certains sont-ils passés dans des registres? De quelle taille avez-vous besoin pour promouvoir les types afin de vous assurer que votre équivalent va_arg obtient toujours le bon choix pour le bon type au bon moment? Etc…

La façon dont je le ferais est la suivante:

Vous connaissez déjà les deux premiers arguments. Le prochain argument serait sur 16 (% ebp), donc je mettrais cette adresse dans un registre et l’utiliserais comme adresse de base. Maintenant, j’parsing ma chaîne, car cela me donne le nombre de registres dont j’ai besoin. Pour chaque argument rencontré, obtenez la valeur de mon adresse de base et augmentez-la de quatre, car l’argument suivant sera là.

Je suppose qu’il n’est pas vraiment nécessaire d’avoir tous les arguments dans le registre en même temps, car vous allez probablement scanner le format en agitant de manière séquentielle.