12

MSVCでインラインアセンブリを使用する場合、このMSDNの記事で説明されているように、C /C++コードのラベルを参照することでアセンブリブロックの外にジャンプできます。

GCCでインラインアセンブリを使用する場合、そのようなことはできますか?

これが私が達成しようとしていることの例です:

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

/* some C code */

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

ただし、コンパイラは「external_label」が定義されていないことについて文句を言います。

4

2 に答える 2

11

この回答のコードはたまたま機能しますが、未定義の動作であり、一般に最適化を有効にすると問題が発生します。を使用してインライン asm ステートメントから jmp アウトする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 に答える