Ответ 1
Что делать, если вы определяете метку с ассемблером?
asm("external_label:");
Обновить: этот код работает:
#include <stdio.h>
int
main(void)
{
asm("jmp label");
puts("You should not see this.");
asm("label:");
return 0;
}
При использовании встроенной сборки под MSVC можно перейти за пределы блока сборки, ссылаясь на метку в коде C/С++, как описано в этом Статья MSDN.
Можно ли это сделать при использовании встроенной сборки в GCC?
Вот пример того, что я пытаюсь выполнить:
__asm__ __volatile__ (
" /* assembly code */ "
" jz external_label; "
);
/* some C code */
external_label:
/* C code coninues... */
Компилятор, однако, жалуется, что "external_label" не определяется.
Что делать, если вы определяете метку с ассемблером?
asm("external_label:");
Обновить: этот код работает:
#include <stdio.h>
int
main(void)
{
asm("jmp label");
puts("You should not see this.");
asm("label:");
return 0;
}
Как и в 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;
}