12

在 MSVC 下使用内联汇编时,可以通过引用 C/C++ 代码中的标签来跳出汇编块,如MSDN 文章中所述

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

这是我要完成的示例:

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

/* some C code */

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

然而,编译器抱怨没有定义“external_label”。

4

2 回答 2

11

这个答案中的代码恰好可以工作,但是是未定义的行为,并且通常会在启用优化的情况下破坏事情。只有在 asm 语句后面跟着 时asm goto,或者在有限的情况下,才可以安全地跳出内联 asm 语句__builtin_unreachable();

(这在这里不可用:跳到内联 asm 语句的中间,然后在函数内再次陷入编译器生成的代码是绝对不安全。)


如果你用汇编器定义标签怎么办?

asm("external_label:");

更新:此代码似乎有效:

#include <stdio.h>

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

  return 0;
}
于 2009-04-13T14:41:04.967 回答
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;
}
于 2017-07-03T13:34:43.420 回答