2009-04-13 18 views
10

Al usar ensamblado en línea bajo MSVC, se permite saltar fuera del bloque de ensamblaje haciendo referencia a una etiqueta en el código C/C++, como se explica en in this MSDN article.Ensamblaje en línea de GCC: salta al bloque exterior de etiqueta

¿Se puede hacer tal cosa cuando se utiliza el montaje en línea en GCC?

He aquí un ejemplo de lo que estoy tratando de lograr:

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

/* some C code */ 

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

El compilador, sin embargo, se queja de que no se define "external_label".

+0

¿Por qué '__volatile__'? – curiousguy

Respuesta

10

¿Qué sucede si define la etiqueta con el ensamblador?

asm("external_label:"); 

actualización: este código parece funcionar:

#include <stdio.h> 

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

    return 0; 
} 
+0

Eso es lo primero que intenté, tampoco funciona. :/ –

+0

Actualicé con una muestra que parece correcta. ¿Funciona para ti? –

+0

Hmm ... Esto es extraño. Su código se compila, sin embargo, al hacer lo mismo en el mío, el vinculador todavía se queja de una referencia no definida. :/ –

1

A partir de GCC 4.5, también se puede utilizar asm goto. El siguiente ejemplo salta a una etiqueta 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; 
} 
Cuestiones relacionadas