GCC内联汇编:跳转到块外标签

Vic*_*rti 10 c x86 assembly gcc

在MSVC下使用内联汇编时,允许通过引用C/C++代码中的标签跳出汇编块之外,如本MSDN文章中所述.

在GCC下使用内联汇编时可以做这样的事吗?

这是我想要完成的一个例子:

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

/* some C code */

external_label:
/* C code coninues... */
Run Code Online (Sandbox Code Playgroud)

但是,编译器抱怨没有定义"external_label".

Bas*_*ard 9

如果使用汇编程序定义标签怎么办?

asm("external_label:");
Run Code Online (Sandbox Code Playgroud)

更新:此代码似乎有效:

#include <stdio.h>

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • "说到标签,不支持从一个asm跳转到另一个.编译器的优化器不知道这些跳转,因此在决定如何优化时他们不能考虑它们.请参阅'使用goto扩展asm'." 请参阅http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html. (5认同)
  • "_这段代码似乎有用:_"如:"有未定义的行为"? (2认同)
  • @BastienLéonard“_为什么不阅读评论?_”您的意思是解释代码的非常小的文字不起作用?“_特别是如果你在我写下答案两年后发布......_”我刚刚发现了这个页面。我想其他人也会找到它。 (2认同)

chu*_*e x 6

从 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;
}
Run Code Online (Sandbox Code Playgroud)