GCC Inline Assembly: переход на ярлык внешнего блока

При использовании встроенной сборки под MSVC можно перейти за пределы блока сборки, ссылаясь на метку в коде C/С++, как описано в этом Статья MSDN.

Можно ли это сделать при использовании встроенной сборки в GCC?

Вот пример того, что я пытаюсь выполнить:

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

/* some C code */

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

Компилятор, однако, жалуется, что "external_label" не определяется.

Ответ 1

Что делать, если вы определяете метку с ассемблером?

asm("external_label:");

Обновить: этот код работает:

#include <stdio.h>

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

  return 0;
}

Ответ 2

Как и в GCC 4.5, вы также можете использовать asm goto. Следующий пример перескакивает на метку 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;
}