3

私は多くの場所で、アセンブリ言語は通常完全なプログラムを作成するために使用されませんが、特定の手順、特に1秒間に数千回呼び出される手順をより効率的にするために他のプログラムによって使用されることを読みました。アセンブリコードの小さなビットがどのように大きなプログラムに組み込まれるのか疑問に思っています。

  • 小さな実行可能ファイルを作成して別のプログラムから実行できると思いましたが、それは非効率的です。

  • 次に、Visual Studioのインラインアセンブリについて考えましたが、これはMicrosoftに固有のものであり、より良い方法があるようです。

では、個別のプログラムを作成したり、Visual Studioインラインアセンブリを使用したりせずに、大きなプログラム内で小さなアセンブリコードを使用するにはどうすればよいでしょうか。

4

4 に答える 4

5

インラインアセンブリはVisualStudioに固有のものではありません-GCCもそれをサポートしています。インラインアセンブリは通常、アセンブリをプログラムに組み込む最も簡単な方法です。ただし、いくつかの問題があります-コードの移植性に大きな影響を与える可能性があり、一部のコンパイラはそれをサポートしていません-たとえば、Microsoftのx64コンパイラはそれをサポートしていません。

インラインアセンブリをサポートしないコンパイラの場合、またはすべてのマシン固有のコードを含める場合は、通常、アセンブリ言語固有の部分を独自のファイルに分割し、アセンブリコードをC++コードが呼び出すことができる関数として公開します。次に、ビルドの一部としてそれらをアセンブルしてリンクします。リンカは、オブジェクトファイルの生成に使用された言語を気にしません。複数の言語のオブジェクトファイルを1つのプログラムにアセンブルできます。

于 2009-06-19T21:57:02.443 に答える
1

次に例を示します(GCC)。

__asm__ ("movl %eax, %ebx\n\t"
"movl $56, %esi\n\t"
"movl %ecx, $label(%edx,%ebx,$4)\n\t"
"movb %ah, (%ebx)");

Microsoftインラインアセンブリの場合、キーワードは__asmであり、アセンブリコードは中括弧で囲まれ、文字列ではなく、宛先レジスタが左側にあります。

Microsoftの例:

int foo(void) {
  __asm{
   mov eax,100 ; Moves 100 into eax!
   leave
   ret
  };
}

詳細情報へのリンク

インラインアセンブリの手順とリファレンス:http ://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

x86に固有のIBMチュートリアル:http ://www.ibm.com/developerworks/linux/library/l-ia.html

于 2009-06-19T21:59:25.590 に答える
1

次に、Visual Studioのインラインアセンブリについて考えましたが、これはMicrosoftに固有のものであり、より良い方法があるようです。

すべてのコンパイラは、通常はわずかに異なる方法ですが、何らかの形式のインラインアセンブリをサポートしています。

したがって、インラインアセンブリを使用する必要がある場合は、各スニペットを小さな関数にカプセル化します。そうすれば、別のコンパイラに移植するときに、それほど労力をかけずにこれらの関数を再実装できます。

于 2009-06-20T05:52:49.350 に答える
0

内部ループのような小さなコードの場合、通常はインラインアセンブリで実行されます。そして、それは間違いなくマイクロソフト固有のものではありません!(GCCとほとんどすべての最新のコンパイラーもそれをサポートしていますが、構文にはさまざまなバリエーションがあります)。

コードの大きなチャンク(たとえば、オペレーティングシステムのブートローダー)の場合、通常は別のソースファイルに入れられ(すべての言語で複数のソースファイルを使用するのと同じように)、プログラムの残りの部分とリンクされます。リンカーを使用します。

コンパイラは現在、ゲームなどの内部ループに使用するのにあまり役立たないほど十分に優れているため、アセンブリは現在OSでのみ使用されていることに注意してください(また、さまざまなアーキテクチャに移植することはできません)。これは主に、ハードウェア割り込みやページング(仮想メモリ)の設定などの非常に低レベルのものに使用されます。

于 2009-06-19T22:11:51.493 に答える