Domanda

Ho un progetto C ++ creata in VS6 che è stato aperto nel VS2010 e compila bene. Esso contiene una classe con un po 'di linea di montaggio incluso il seguente codice:

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

tutto bene e dandy, fino a quando cerco di creare un nuovo progetto MFC C ++ in VS2010 e aggiungi la classe con il codice pezzi di cui sopra. Improvvisamente, questo non verrà compilato come la più recente interpretazione del __asm ??richiede il codice per le seguenti (o qualcosa di simile; questo compilazioni in ogni caso):

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

Ora, per la vita di me, non riesco a capire quale sia la differenza tra i due progetti, che permette il progetto VS6 convertito per compilare il (presunto attualmente valido) in linea di assemblaggio di codice in VS2010, mentre una lattina progetto appena creato 't.

C'è da qualche parte un ambiente (nascosta), che permette di utilizzare il vecchio compilatore VS6?

È stato utile?

Soluzione

Il VS6 inline sembra un bug che è stato risolto. Lo dico perché io non sono sicuro di come il compilatore potrebbe verificare che m_pImage era un membro di quello che è stato caricato nel registro eax e quindi non riusciva a trovare l'offset. Per rispondere alla tua domanda, non c'è modo, sono consapevole, per usare la vecchia semantica di ASM nel compilatore VS6.

I farebbe una variabile esterna locale della ASM linea e assegnare tale per esi invece.

void * pointer = this.m_pImage;
__asm
{
   mov ebx, pointer
   mov esi, ebx
   ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top