1

私は現在、大学でコースを受講しており、この段階では、特定の C/C++ 構造の背後にあるアセンブラー コードについて学びます。

ワークフローは通常、次のようになります。ラボ アシスタントがトピックについて簡単に話し、私たちが癖を見つけてから、インライン アセンブリを使用して完全にランダムな問題を解決します。

struct(例: 彼は(メンバー) がメモリにどのように格納されるかについて簡単に説明し、パターンを理解してから、インライン アセンブリを使用して、 を使用する単純な問題の解決策を記述しstructます。)

ラボ アシスタント (およびグループの他のメンバー) はVisual C++、デモンストレーションにコンパイラとデバッガ (逆アセンブル用) を使用していますが、私は倫理上の理由で使用できないため、 と を選択しましg++gdb

Visual C++ と比較して g++ のインライン アセンブリについて私が厄介だと思うのは、次の事実です。

  • インライン アセンブリの「ブロック」を書きたい場合、2 つのオプションがあります。asm("..")各命令の前に a が付いた単一の構造を使用します\n\t(多くの混乱につながります)。または、各命令を独自のasm("..")ブロックに入れます (大量の入力につながります)。

  • インライン アセンブリでローカル変数を参照する場合は、拡張構文を使用するか、esp/へのオフセットを使用して参照する必要がありますebp

上記の 2 つの問題に関して、私は Visual C++ のインライン アセンブリ スタイルを好みます。このスタイルでは、asm ブロックを記述するために必要なことは__asm { .. }、各命令を新しい行に記述し、変数を参照するために記述するだけです。その名前。

検索を通じて、Apple がg++スイッチ (-fasm-blocks) を使用して Visual C++ と同じ構文をサポートしていることを発見しましたが、これは GNU には当てはまらないようですg++

Visual C++GNU の下でインラインアセンブリブロックのようにコンパイルできるかどうかをここで尋ねていますg++

4

1 に答える 1

2

参照している構文は、Microsoft固有のものではありません。あなたが見つけたように、Appleもそれを持っていました(AppleはGCCをあきらめてClangに切り替えましたが)。AFAIK、Metrowerksは同じ構文をサポートしています。GCCはそれをサポートしていません(おそらくGCCは、GCCが非常に優れているため、アセンブリを作成する必要がなくなったと考えているためです:-))。ただし、常に入力する必要はなく、に\n\t置き換えることができます;。例えば:

void foo()
{
    asm("xor %eax,%eax;"
        "rep; nop;"
        "nop;"
        "sfence;"
        "nop;");
}

それが役に立てば幸い。幸運を!

于 2013-03-12T20:26:52.943 に答える