2011-01-07 5 views
2

J'ai un projet C++ créé dans VS6 qui a été ouvert dans VS2010 et compile bien. Il contient une classe avec un peu de montage en ligne, y compris le code suivant:Visual Studio 2010 compiler l'assemblage en ligne en C++ comme si Visual Studio 6?

__asm{ 
    mov eax,this 
    mov esi,[eax].m_pImage 
    ... 

bien beau, jusqu'à ce que je tente de créer un nouveau projet MFC C++ dans VS2010 et ajouter la classe avec le code de montage ci-dessus. Tout à coup, ce ne sera pas compilé comme nouvelle interprétation de __asm ​​exige que le code soit comme suit (ou quelque chose de similaire, ce qui compile en tout cas): Maintenant

__asm{ 
    mov eax,this 
    mov esi,[eax]this.m_pImage 
    ... 

, pour la vie de moi, je ne peux pas Quelle différence y a-t-il entre les deux projets, ce qui permet au projet VS6 converti de compiler le code d'assemblage en ligne (présumable actuellement invalide) dans VS2010, alors qu'un projet nouvellement créé ne le peut pas.

Y at-il quelque part un paramètre (caché) qui permet d'utiliser l'ancien compilateur VS6?

+0

Pourquoi utiliser un assembleur en ligne? – Puppy

Répondre

2

L'ASM en ligne VS6 semble être un bug qui a été corrigé. Je dis cela parce que je ne suis pas sûr comment le compilateur pourrait vérifier que m_pImage était un membre de ce qui a été chargé dans le registre eax et n'a donc pas pu trouver le décalage. Pour répondre à votre question, il n'y a aucun moyen, à ma connaissance, d'utiliser l'ancienne sémantique ASM dans le compilateur VS6.

Je voudrais créer une variable locale en dehors de l'ASM en ligne et l'affecter à esi à la place.

void * pointer = this.m_pImage; 
__asm 
{ 
    mov ebx, pointer 
    mov esi, ebx 
    ... 
+1

Lorsque vous convertissez un projet à partir de VS6 (et UNIQUEMENT VS6 - cela ne se produit pas pour les autres versions), une tonne de paramètres de compatibilité sont appliqués. Il est probable que ce correctif a été ajouté mais l'ancien chemin de code est toujours utilisé en mode de compatibilité VS6. –

+0

Et il n'y a aucun moyen de répliquer ces paramètres de compatibilité? – Daan

+0

Ignorer ce dernier commentaire ... En lisant la réponse et le commentaire de Billy à nouveau, il devient clair pour moi que nous ne devrions pas vouloir que notre ancien code VS6 buggé fonctionne encore aujourd'hui. – Daan