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.
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;
}
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
[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]
la sortie ici a l'execution donne ceci:
0xe54050 0xe54080 0xe540a0
in Affiche received 3 str with total of 4 parameter
0xe54050 0xe54070 0xe54090
From pusher : 'v = un - - (3)'
si je mets comme taille au niveau des mallocs pour s[0] 3, s[1] 5, et s[2] 16 j'ai :
0xf9f050 0xf9f070 0xf9f090
in Affiche received 3 str with total of 4 parameter
0xf9f050 0xf9f070 0xf9f090
From pusher : 'v = un - deux - trois (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 8
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.