2012-07-15 19 views
5

Ho avuto qualche problema ad accedere a una variabile statica con l'assemblatore in linea nel linguaggio di programmazione D. La documentazione dice che devo accedere a variabili locali conD Assemblatore in linea: variabile statica di accesso

mov EAX, var[EBP]; //or mov EAX, var; 

e di classe con variabili

mov EBX, this; 
mov EAX, var[EBX]; 

Ma si mangia documentato come accedere a una variabile statica. Ecco il mio codice che genera un errore:

module test; 

static int A = 1234; 

static void SetA() 
{ 
    asm 
    { 
     mov A, 5432; //compiles, but throws an error 
     //tried it with "mov dword ptr [A], 5432; too 
    } 
} 

ho davvero bisogno di un modo di qualche "stoccaggio globale" per gli interi che sono accessibili da entrambi, assemblatore e D, sarei molto felice di aiuto con questo (o un modo alternativo).

risposta

4

Le variabili globali si trovano nella memoria locale del thread per impostazione predefinita in D2. Utilizzare __gshared per dichiarare una variabile statica "classica".

Questo funziona:

module test; 

__gshared int A = 1234; 

void SetA() 
{ 
    asm 
    { 
     mov A, 5432; 
    } 
} 

unittest 
{ 
    SetA(); 
    assert(A == 5432); 
} 
+0

non posso, grazie, funziona ora! –

+0

Puoi vedere questo codice in azione su http://dpaste.dzfl.pl/ead5ed8e – DejanLekic

2

Nota: La static su A è ridondante dal momento che è una variabile a livello di modulo. Lo stesso per le funzioni a livello di modulo.

In D, le variabili a livello di modulo vanno nella memoria locale del thread. Devi contrassegnare una variabile come __gshared se hai veramente vuoi che sia globale. L'accesso alle variabili TLS nell'assemblaggio in linea non è praticamente possibile in modo portatile.

Un modo per fare ciò che si vuole:

module test; 

/*static*/ int A = 1234; 

/*static*/ void SetA() 
{ 
    int a; 

    asm 
    { 
     mov a, 5432; 
    } 

    A = a; 
} 

Edit: Se si intende __gshared, poi vedere la risposta di CyberShadow. :)

+0

Puoi vedere questo codice in azione su: http://dpaste.dzfl.pl/64f6a656 – DejanLekic

Problemi correlati