1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <stdio.h>
//Fonction pour afficher 5 long, puis un nombre indéterminé de caractères
/*Attention : ne fonctionne pas avec optimisation : trop de modification dans la structure du programme (et surtout des fonctions à nombre
variable de paramètres) : manifestement, aucune sur les grosses fonctions à nombre invariable d'arguments*/
void f (int n, ...)
{ //En partant du principe que n indique le nombre de paramètre passés en arguments
/*Le passage d'argument se fait de la même manière que si l'on utilise des int (5 arguments suivent le premier, puis l'on saute pour
accéder aux suivants). De plus, il faut incrémenter liste à chaque fois de 2, et d'abord incrémenter l'adresse de liste de 9 (deux int
pour liste, 7 pour la sauvegarde de la pile, enfin je suppose)*/
/*Plus explicitement, le saut d'adresse se fait par tranches de 4 : liste+1 => liste+4. Ensuite, passé les 5 premiers arguments, il faut
faire un saut de 36 (je ne sais pas pour quoi) pour récupérer les arguments suivants. Ensuite, continuer à sauter de 2 en 2. Enfin, si
l'on met des arguments suplémentaires dans la fonction, il faut incrémenter liste (lors du premier saut et du deuxième) de la taille
de ces arguments. Exemple : 2 int* = 4 int => liste+4*/
int* RSP;
int* RBP;
asm("mov %%rbp, %%rbx"
:"=b" (RBP));
asm("mov %%rsp, %%rax"
:"=a" (RSP));
printf("%p\n", RBP);
printf("%p\n", RSP);
// NB : RSP : pointeur de pile, RBP : pointeur de base de la pile => Utile pour le debug
int *liste = &n+9+4;
for(int i = 0; i<n && i<5; i++)
{
liste+=2; //On récupère l'adresse de l'argument suivant
long carAct = *((long*) liste);
printf("%li ", carAct); //On affiche l'argument
}
liste+=40;
for(int i = 5; i<n; i++)
{
liste+=2;
char carAct = *((char*) liste);
printf("%c ", carAct); //On affiche l'argument
}
putchar('\n');
}
int main (void)
{
f ((int)7, 'a', 'b', 'c', 'z', 'a', 'a', 'b');
f ((int)7, 123456, 123456, 123456, 123456, 123456, 'c', 'z');
return 0;
} |
Partager