Встроенная сборка GCC: переход к метке вне блока - PullRequest
10 голосов
/ 13 апреля 2009

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

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

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

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

/* some C code */

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

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

Ответы [ 2 ]

10 голосов
/ 13 апреля 2009

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

asm("external_label:");

Обновление : кажется, что этот код работает:

#include <stdio.h>

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

  return 0;
}
1 голос
/ 03 июля 2017

Начиная с 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;
}
...