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

Signaler
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
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

Messages postés
59
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
2 juin 2004

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
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

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
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

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
Messages postés
500
Date d'inscription
mardi 16 avril 2002
Statut
Membre
Dernière intervention
2 août 2004

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
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

-------------------------------
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
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

-------------------------------
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
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Je peux pas voir sans source.
Mais l'accès aux champs fonctionne avec TASM

Core Breaker :)
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

-------------------------------
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
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
C'est TASM qui t'envoie ce message d'eereur ?

Core Breaker :)
Messages postés
500
Date d'inscription
mardi 16 avril 2002
Statut
Membre
Dernière intervention
2 août 2004

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
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

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
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

mais MASM non %-6

Y'a plus qu'a attendre un pro de masm
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Messages postés
14
Date d'inscription
dimanche 19 janvier 2003
Statut
Membre
Dernière intervention
17 mai 2003

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