DevCPP inline asm error

belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 - 16 août 2008 à 03:42
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 17 août 2008 à 18:31
Bon, je suis en plein creation d'un petit dll qui utilise
le ASM inline, j'ai plusieur fonction qui on touts les meme
erreur. Cependant je ne trouve pas le moyen de corriger
tout sa. alor voilla tout ...

L'Erreure :
-----------------------------------------------------------
-----------------------------------------------------------
'pushad'
Too many memory references for 'mov'
Too many memory references for 'add'
'popad'
-----------------------------------------------------------
-----------------------------------------------------------

Code:
-----------------------------------------------------------
-----------------------------------------------------------
void ZPostShotMelee()
{
    float MyPos[3] = {0.000000};
    memcpy(MyPos,GetPosition((void*)MyZCharacter()),12);
    asm("pushad");
    asm("mov eax,ZPostShotMeleeAddress");
    asm("PUSH 7");
    asm("PUSH MyPos");
    asm("call eax");
    asm("add esp,8");
    asm("popad");
}
-----------------------------------------------------------
-----------------------------------------------------------

Screenshoot :

Merci pour votre futur aide

4 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
16 août 2008 à 04:06
Par defaut gcc n'accepte que de l'asm AT&T tu peut neanmoins lui faire accepter de l'asm Intel en ajoutant ce code:
asm(".intel_syntax noprefix");

Neo_Fr
0
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
16 août 2008 à 04:36
Voila la nouvelle erreur

Screenshoot :

Merci pour votre futur aide
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
16 août 2008 à 16:55
Essaye de cette facon:
asm(".intel_syntax noprefix

Ton code en asm Intel ici..

\n");

Neo_Fr
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 août 2008 à 18:31
Salut,

Sauf erreur de ma part, l'assembleur que tu nous montre ici n'est pas du tout inévitable.

    asm("pushad");   // Sauvegarde du contexte. On s'en fou un peu
    asm("mov eax,ZPostShotMeleeAddress");    // On met une adresse dans eax
    asm("PUSH 7");   // On pousse 7
    asm("PUSH MyPos");  // On pousse l'adresse du tableau MyPos (On passe un paramètre)
    asm("call eax");             // On appel l'adresse précédement mise dans eax (On passe un autre paramètre)
    asm("add esp,8");        // On dépile les paramètres, typique d'un appel en cdecl
    asm("popad");        // On restaure le context

Cela ressemble beaucoup à un appel d'une fonction de convention cdecl, prenant deux paramètres, un pointeur sur un tableau de float et un entier, et ne renvoyant rien (Ou du moins on se fiche du résultat).

En cdecl, les paramètres sont poussés de droite à gauche. Donc je dirais que la fonction appelée à le prototype suivant  :
void __cdelc ZPostShotMeleeAddress(float* lpPos, int val)
On ne peut pas deviner le type de retour, mais ça n'a pas d'importance.

Le code ci-dessus revient à l'appeler en lui passant (MyPos, 7).

Par contre, tu travailles avec une adresse (ZPostShotMeleeAddress) que je ne sais pas comment tu la récupères...

Il faudra donc peut être que tu déclare un pointeur sur fonction et que tu récupère l'adresse de ta fonction dans ce pointeur.

Mais bon, peut être que tu as pas mal d'asm à traduire...

Si la méthode de Neo_Fr ne fonctionne pas, tu peux essayer de traduire en AT&T. Pour traduire, tu peux commencer par regarder ce source par exemple.
0
Rejoignez-nous