2011-06-03 5 views
2

J'ai encore une autre erreur en essayant de compiler avec GCC 4.2.1 d'Apple utilisant le -fasm blocs arguments (qui permet Intel de style syntaxe de montage) code assembleur en ligne qui a travaillé dans MSVC: opérande d'assemblage de blocs non reconnu, label 'LASM TYPE $' utilisé mais non défini:erreur assembleur en ligne GCC: opérande d'assemblage bloc non reconnu

typedef struct _MyStruct 
{ 
    int data; 
    //... 
}MyStruct; 

void testAsm() 
{ 
    MyStruct *pMyStruct = new MyStruct(); // Please not that I create an instance of MyStruct here only for the sake of simplicity 

    _asm 
    { 
     mov edi, pMyStruct 
     add edi, TYPE MyStruct // error: block assembly operand not recognized. label 'LASM$TYPE' used but not defined 
     //... 
    }; 

    delete pMyStruct; 
} 


Comment puis-je résoudre ce problème?

+0

Qu'essayez-vous exactement de faire? Je n'ai jamais vu de syntaxe comme ça en Visual C++ ... – Goz

+0

En fait, c'est la première fois que je le vois aussi et je n'ai pas pu trouver de documentation, ce qui le couvrirait ... – Ryan

+0

J'ai aussi rencontré une variation de ce problème - dans un autre code d'assemblage en ligne, le mot-clé offset est utilisé: "mov eax, offset fptr", où fptr est une fonction "void fptr (void * pData)" ... Cette fois, GCC signale une erreur reconnu ":: – Ryan

Répondre

1

TYPE est un mot-clé MSVC-specificasm. Ici, cela signifie simplement sizeof. J'ai essayé de trouver de la documentation sur gcc asm-block sur le web, mais j'ai abandonné après dix minutes. Essayer

add edi,sizeof(MyStruct) 

et de variantes. Je n'ai pas de Apple, donc je ne peux pas l'essayer pour vous.

Mise à jour pour répondre à la question dans le commentaire: Essayez ceci:

add edi,__offsetof(MyStruct,MyMember) 

Si cela ne fonctionne pas, voir "Using the GNU Compiler Collection" pour la documentation.

+0

Merci, cela semble fonctionner! Puis-je aussi vous demander de me dire comment faire face au mot-clé offset – Ryan

+0

@Ryan: Voir mise à jour – TonyK

+0

Homme, je ne peux pas croire que j'ai raté cela ... Merci beaucoup, Tony! – Ryan

Questions connexes