(Debutant en ASM) (MASM) pointeur sur une structure

cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003 - 5 mai 2003 à 21:56
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 7 mai 2003 à 00:46
Salut,

voila mon pb, j'aimerai créer une fonction en asm qui reçoit un pointeur sur un élément de type structure, jusque-là pas de pb

mais comment modifier les éléments de la structure pointée ?

ex en C(++) on fait ça

typedef struct {
unsigned long membre1;
            unsigned short membre2;
} MyStruct; 
 
void MaFonction(MyStruct* pStruct)
{
   pStruct->membre1 = 0xFDE8;
   pStruct->membre2 = 0xFF;
}  


La question est simple (mais je n'ai pas encore trouvé la réponse) comment faire ça en ASM ?
Surtout le code pStruct->membre1 = 0xFDE8;

decrarer la structure ca je sait le faire
 
MYSTRUCT STRUCT
membre1	DWORD	?
membre2	WORD	?
MYSTRUCT ENDS


un pointeur (une adresse en memoire) c'est un entier codée sur 32bits donc je suppose que le parametre a passer a la fonction asm est un DWORD ?
 
MaFonction PROC pstruct:DWORD ;
; ??? 
 ret
MaFonction ENDP

mais pour le reste je sait pas :sad)
un petit exemple pour m'aider à assimiler la technique se serait sympa ;)

25 réponses

TangiX Messages postés 59 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 2 juin 2004
6 mai 2003 à 11:20
pStruct->membre1 = 0xFDE8;
pStruct->membre2 = 0xFF;

mov dword ptr[pstruct], 0FDE8h
mov word ptr [pstruct + 4], 0FFh


c doit marché ca
ya peut etre mieux j'connais pas bien les strutures en asm

ps:y manque le plus entre pstruct et 4 (s'affiche pa ds l'apercu)

%-6 TangiX %-6
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 18:04
Marche po :sad)

Y'a pas d'erreur à la compilation, mais dans la fonction appelante là contenue de la structure n'est pas modifiée
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 18:05
Marche po :sad)

Y'a pas d'erreur à la compilation, mais dans la fonction appelante là contenue de la structure n'est pas modifiée
0
cs_Dean Messages postés 500 Date d'inscription mardi 16 avril 2002 Statut Membre Dernière intervention 2 août 2004
6 mai 2003 à 19:18
Bonjour,

Je ne sais pas si ça marche, mais bon :

.data?
pStruct MYSTRUCT <?>

.code
mov pStruct.membre1, FDE8h

Bon, il reste à intégrer ceci dans une fonction mais je pense que ça devrait ressembler à ça...

Dean - http://charloweb.ipfixe.net
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 19:43
-------------------------------
Réponse au message :
-------------------------------

> Bonjour,
>
> Je ne sais pas si ça marche, mais bon :
>
> .data?
> pStruct MYSTRUCT <?>
>
> .code
> mov pStruct.membre1, FDE8h
>
> Bon, il reste à intégrer ceci dans une fonction mais je pense que ça devrait ressembler à ça...
>
> Dean - http://charloweb.ipfixe.net
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Marche po :sad)
> >
> > Y'a pas d'erreur à la compilation, mais dans la fonction appelante là contenue de la structure n'est pas modifiée
> >
> >
>

pas ça non plus

la fonction que je veux créer reçoit comme paramètre un pointeur sur une structure et doit un modifier les membres directement à l'adresse pointée
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 20:10
Tu dois d'abord mettre dans un registre de pointage la valeur de l'adresse afin de la déférencer:
MaFonction PROC pstruct:DWORD
 les di, pstruct
 mov ax, word ptr es:[di].membre2
 ret
MaFonction ENDP

Core Breaker :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 20:14
Pardon, je me suis tompé, pour la modifier, mais quand même tu dois d'abord mettre dans un registre de pointage la valeur de l'adresse afin de la déférencer:
MaFonction PROC pstruct:DWORD
 les di, pstruct
 mov ax, valeur
 mov word ptr es:[di].membre2, ax
 ret
MaFonction ENDP

Core Breaker :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 20:17
J'oubliai tu peux faire ça aussi:
MaFonction PROC pstruct:DWORD
 les di, pstruct
 mov ax, valeur
 mov word ptr es:[di.membre2], ax ;chager la place de .membre2
 ret
MaFonction ENDP

Core Breaker :)
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 20:53
-------------------------------
Réponse au message :
-------------------------------

> Tu dois d'abord mettre dans un registre de pointage la valeur de l'adresse afin de la déférencer:
>
> MaFonction PROC pstruct:DWORD
>  les di, pstruct
>  mov ax, word ptr es:[di].membre2
>  ret
> MaFonction ENDP
> 

> Core Breaker :)
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Salut,
> >
> > voila mon pb, j'aimerai créer une fonction en asm qui reçoit un pointeur sur un élément de type structure, jusque-là pas de pb
> >
> > mais comment modifier les éléments de la structure pointée ?
> >
> > ex en C(++) on fait ça
> >
> >
> >
> > typedef struct {
> > 	unsigned long membre1;
> >             unsigned short membre2;
> > } MyStruct; 
> >  
> > void MaFonction(MyStruct* pStruct)
> > {
> >    pStruct->membre1 = 0xFDE8;
> >    pStruct->membre2 = 0xFF;
> > }  
> > 

> >
> > La question est simple (mais je n'ai pas encore trouvé la réponse) comment faire ça en ASM ?
> > Surtout le code pStruct->membre1 = 0xFDE8;
> >
> > decrarer la structure ca je sait le faire
> >
 
> > MYSTRUCT STRUCT
> > 	membre1	DWORD	?
> > 	membre2	WORD	?
> > MYSTRUCT ENDS
> > 

> >
> > un pointeur (une adresse en memoire) c'est un entier codée sur 32bits donc je suppose que le parametre a passer a la fonction asm est un DWORD ?
> >
 
> > MaFonction PROC pstruct:DWORD ;
> > ; ??? 
> >  ret
> > MaFonction ENDP
> > 

> > mais pour le reste je sait pas :sad)
> > un petit exemple pour m'aider à assimiler la technique se serait sympa ;)
>

Le compilateur me retourne une erreur "undefined symbol : immin" (immin est un membre de la structure)

ps: je ne sais pas si c'est important, mais la fonction appelante (celle qui transmet le pointeur a MaFonction ASM) et une fonction écrite en C
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 21:17
Je peux pas voir sans source.
Mais l'accès aux champs fonctionne avec TASM

Core Breaker :)
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 21:33
-------------------------------
Réponse au message :
-------------------------------

> Je peux pas voir sans source.
> Mais l'accès aux champs fonctionne avec TASM
>
> Core Breaker :)
>
>

la fonction appelante C crée pout tester

void test() 
   registry reg;

   LoadInfo(&reg);

   printf("%x\n\n", reg.immin);
}

la fonction appelée ASM (c'est là qu'une valeur doit être affectée aux éléments du pointeur)

LoadInfo PROC reg:DWORD  ;MOV #imm,rn 
   les di, reg
   mov ax, 02Dh ; pour tester
   mov WORD ptr es:[di].immin,ax
   ret
LoadInfo  ENDP


bien evidenment la structure registry est declaré corectement dans les deux code (C et ASM) et il existe un prototype C de la fonction ASM
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 21:50
Le code asm est bon mais le code en C est douteux
En général ça dois faire ainsi:
typedef struct
{
unsigned short immin;
} t_registry;

void LoadInfo(t_registry far *);

t_registry reg;

LoadInfo(&reg);

Core Breaker :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 22:00
C'est TASM qui t'envoie ce message d'eereur ?

Core Breaker :)
0
cs_Dean Messages postés 500 Date d'inscription mardi 16 avril 2002 Statut Membre Dernière intervention 2 août 2004
6 mai 2003 à 22:00
OK c'est une erreur de ma part.

Dans ce cas-là, tu passes l'offet à ta fonction :

push OFFSET InstanceStruct
call Myfunction

Ensuite tu manipules directement comme ceci (par exemple) :

mov variable, [pstruct] ; variable contient les données
mov variable.membre1, FDE8h

Là encore, je ne sais pas si ça marche, mais je pense que ça se rapproche plus de ce que tu recherches...

Dean - http://charloweb.ipfixe.net
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 22:25
Le code C il va bien (aucune erruer de compilation ou d'execution)
le revoila, complet

typedef struct {
DWORD GenReg[16];
DWORD CtrlReg[8];
DWORD SysReg[8];
DWORD FpReg[32];
WORD immin;
} registry;

void __stdcall LoadInfo(registry*); /*Prototype de la fonction asm*/

int main(int argc, char* argv[])   /*test de la fonction asm*/
{ 
   registry reg;

   LoadInfo(&reg);

   printf("%x\n\n", reg.immin);

   return 0;
}<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>

Le code asm (complet)

<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>.386
.model flat, stdcall  

REGISTRY STRUCT                 ;declaretion asm du type registry 
GenReg	DWORD	16 DUP (?)
CtrlReg	DWORD	8  DUP (?)  
SysReg	DWORD	8  DUP (?)  
FpReg	DWORD	32 DUP (?)
immin	WORD	? 
REGISTRY ENDS

.code

LoadInfo PROC reg:DWORD  
   ;Ben voila le pb 
   ;je dois modifier les membres du pointeur recu en 
   ;parametre mais je n'y arrive pas  
   ret
LoadInfo  ENDP

end


c'est masm qui renvoi une erreur quant j'utilise ton code
J'utilise visual studio pour pour le projet mixte C/asm le compilateur asm est donc MASM
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 22:25
TASM à compiler parfaitement le code suivant:

.model huge
registry struc
immin dw 0
registry ends
.code
LoadInfo PROC reg:DWORD ;MOV #imm,rn 
 les di, reg
 mov ax, 02Dh ; pour tester
 mov WORD ptr es:[di].immin,ax
 ret
LoadInfo ENDP 
end


Core Breaker :)
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 22:42
mais MASM non %-6

Y'a plus qu'a attendre un pro de masm
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 23:01
Je ne savais pas que tu utilisais masm car c'est différent du moins de vue de l'utilisation des directives:

registry struc
immin WORD 0
registry ends
...
LoadInfo PROC reg:DWORD ;MOV #imm,rn 
les di, reg
...
mov (registry ptr es:[di]).immin,ax

ou
mov es:[di].registry.immin,ax
...
ret
LoadInfo ENDP

Avec TASM ça fonctionne tel que je te l'avais indiqué

Core Breaker :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 mai 2003 à 23:05
0
cs_Otaku Messages postés 14 Date d'inscription dimanche 19 janvier 2003 Statut Membre Dernière intervention 17 mai 2003
6 mai 2003 à 23:12
maintenant j'ai ce message d'erreur "cannot use 16-bit register with a 32-bit address"
pour le code mov es:[di].registry.immin,ax
0
Rejoignez-nous