2009-04-13 9 views
10

MSVCでインラインアセンブリを使用する場合は、in this MSDN articleのようにC/C++コードのラベルを参照してアセンブリブロックの外に飛び越えることができます。GCCインラインアセンブリ:ブロック外のラベルにジャンプ

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

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

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

/* some C code */ 

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

コンパイラは、しかし、「external_label」が定義されていない文句を言います。

+0

なぜ「__volatile__」ですか? – curiousguy

答えて

10

アセンブラでラベルを定義するとどうなりますか?

asm("external_label:"); 

更新は:

#include <stdio.h> 

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

    return 0; 
} 
+0

これは私が試した最初のものですが、どちらもうまくいきません。 :/ –

+0

正しいと思われるサンプルが更新されました。それはあなたのために働くのですか? –

+0

うーん...これは変です。あなたのコードはコンパイルされますが、私の中で同じことをするとき、リンカーはまだ未定義のリファレンスについて不満を持ちます。 :/ –

1

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; 
}