bonjour,
celle la je sais pas si je dois la placer dans asm ou C ou meme linux (vue que un utilise pas CDECL)
je suis un peu confus avec un probleme.
j'ai une fonction C (main) qui appelle une fonction asm(_pusher) qui a son tour appel un C(_affiche) et le retour de _affiche est renvoye a main.le code assembleur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #define _GNU_SOURCE #include <stdlib.h> #include <stdio.h> char * _pusher(int x,char **y); char * _Affiche(int a,char *s1,char *s2,char *s3); //------------- Main fucntion --------------- int main(int argc, char **argv) { char **str = malloc(sizeof(char *) * 2); str[0] = malloc(sizeof(char) + 32); str[1] = malloc(sizeof(char) + 8); str[2] = malloc(sizeof(char) + 16); sprintf(str[0],"un"); sprintf(str[1],"deux"); sprintf(str[2],"trois"); fprintf(stdout,"%p %p %p\n",str[0],str[1],str[2]); char *s = _pusher(3,str); fprintf(stdout,"From pusher : '%s'\n",s); free(s); free(str[0]); free(str[1]); free(str[2]); free(str); return EXIT_SUCCESS; } /*--------------------------------------------------------------------------------*/ char * _Affiche(int a,char *s1,char *s2,char *s3) { char *str; fprintf(stdout,"in Affiche received %d str with total of %d parameter\n",a,a+1); fprintf(stdout,"%p %p %p\n",s1,s2,s3); asprintf(&str,"v = %s - %s - %s (%d)",s1,s2,s3,a); return str; }
la sortie ici a l'execution donne ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 [CPU x64] [BITS 64] extern _Affiche global _pusher [SECTION .text] _pusher: push rbp ;sauf rbp mov rbp,rsp ;prepare ma nouvelle stack car si j'ai plus de 6 parametre a envoyer vers _aff je vais devoir push ;mov rdi,1 ;touche pas a rdi le premier parametre y estt mov rax,20h add rsi,rax ;rsi a le 2 eme parametre recu donc char ** je place a la position du premier char * mov rdx,rsi ; je passe deuxieme char * a rdx qui sera donc .... mov rax,20h add rdx,rax mov rcx,rdx ;je passe le 3eme char * a rcx add rcx,rax call _Affiche ;attention name mangling add rsp,24 mov rsp,rbp pop rbp ret [SECTION .data] [SECTION .bss]si je mets comme taille au niveau des mallocs pour s[0] 3, s[1] 5, et s[2] 16 j'ai :0xe54050 0xe54080 0xe540a0
in Affiche received 3 str with total of 4 parameter
0xe54050 0xe54070 0xe54090
From pusher : 'v = un - - (3)'Pour commencer on voit que je decalle rsi de 32 (0x20 ou 20h) c'est une premiere magouille car dans ma logique je devrais decaller de 80xf9f050 0xf9f070 0xf9f090
in Affiche received 3 str with total of 4 parameter
0xf9f050 0xf9f070 0xf9f090
From pusher : 'v = un - deux - trois (3)'
et donc la je ne comprend plus rien.
je m'attend d'ai a avoir char **s donne &s[1] = &s[0] + 8, &s[2] = &s[1] + 8 ....
mais la j'ai un truc qui depend de size dans malloc.
ps : pour ce que ca interesse le pourquoi de tout ca, c'est pour contourner un probleme ou une fonction attend un nombre non determiner d'argument quand j'ai un tableau de charactere.
une fonction dans le genre de vprintf. j'appelle donc mon code asm pour casser le tableau et envoyer les arguments a l'autre fonction.
Partager