2009-04-13 11 views
10

Quando si utilizza l'assembly inline in MSVC, si può saltare all'esterno del blocco di assiemi facendo riferimento a un'etichetta nel codice C/C++, come spiegato in this MSDN article.GCC Inline Assembly: Vai all'etichetta all'esterno del blocco

È possibile eseguire questa operazione quando si utilizza l'assemblaggio in linea in GCC?

Ecco un esempio di quello che sto cercando di realizzare:

__asm__ __volatile__ (
" /* assembly code */ " 
" jz external_label; " 
); 

/* some C code */ 

external_label: 
/* C code coninues... */ 

Il compilatore, però, lamenta "external_label" non in fase di definizione.

+0

Perché "__volatile__'? – curiousguy

risposta

10

Cosa succede se si definisce l'etichetta con l'assemblatore?

asm("external_label:"); 

Aggiornamento: questo codice sembra funzionare:

#include <stdio.h> 

int 
main(void) 
{ 
    asm("jmp label"); 
    puts("You should not see this."); 
    asm("label:"); 

    return 0; 
} 
+0

Questa è la prima cosa che ho provato, non funziona neanche. :/ –

+0

Ho aggiornato con un campione che sembra corretto. Per te funziona? –

+0

Hmm ... Questo è strano. Il tuo codice si compila, tuttavia quando fai la stessa cosa nella mia, il linker si lamenta ancora di un riferimento indefinito. :/ –

1

Come di GCC 4.5, è possibile utilizzare anche asm goto. L'esempio seguente passa a un'etichetta C:

#include <stdio.h> 

int main(void) { 
    asm goto (
     "jmp %l[done]" // %l == lowercase L 
     : 
     : 
     : 
     : done   // specify c label(s) here 
    ); 
    printf("Should not see this\n"); 

done: 
    printf("Exiting\n"); 
    return 0; 
} 
Problemi correlati