GCC 内联汇编:跳转到块外的标签
在 MSVC 下使用内联汇编时,可以通过引用 C/C++ 代码中的标签来跳出汇编块,如下所述 在此 MSDN 文章中。
在GCC下使用内联汇编可以做到这样的事情吗?
这是我想要完成的示例:
__asm__ __volatile__ (
" /* assembly code */ "
" jz external_label; "
);
/* some C code */
external_label:
/* C code coninues... */
然而,编译器抱怨“external_label”未定义。
When using inline assembly under MSVC, one is allowed to jump outside of the assembly block by referencing a label in the C/C++ code, as explained in this MSDN article.
Can such thing be done when using inline assembly under GCC?
Here's an example of what I'm trying to accomplish:
__asm__ __volatile__ (
" /* assembly code */ "
" jz external_label; "
);
/* some C code */
external_label:
/* C code coninues... */
The compiler, however, complains about "external_label" not being defined.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个答案中的代码恰好可以工作,但是是未定义的行为,并且通常会在启用优化的情况下破坏事物。 只有使用
asm goto
或 在有限的情况下,当 asm 语句后跟__builtin_unreachable();
(这在这里不可用:跳入永远不会安全 在内联 asm 语句的中间,然后在函数内再次陷入编译器生成的代码中。)
如果使用汇编器定义标签会怎样?
更新:此代码似乎有效:
The code in this answer happens to work, but is undefined behaviour and will in general break things with optimization enabled. It's only safe to jmp out of an inline asm statement with
asm goto
, or under limited circumstances when the asm statement is followed by__builtin_unreachable();
(That's not usable here: it's never safe to jump into the middle of an inline asm statement and then fall out into compiler-generated code again inside a function.)
What if you define the label with the assembler?
Update: this code seems to work:
从 GCC 4.5 开始,您还可以使用
asm 转到
。 以下示例跳转到 C 标签:As of GCC 4.5, you can also use
asm goto
. The following example jumps to a C label: