4

それで、GCCがインラインアセンブリを実行できることを知り、2つのことを考えていました。

  1. インラインアセンブリができることの利点は何ですか?

  2. GCCをアセンブリコンパイラ/アセンブラとして使用してアセンブリを学習することは可能ですか?

私はいくつかの記事を見つけましたが、それらはすべて古いもので、2000年と2001年であり、それらの関連性についてはよくわかりません。

ありがとう

4

7 に答える 7

14

インライン アセンブリの利点は、アセンブリ コードをインライン化できることです (待って待ってください、私を殺さないでください)。これを行うことで、呼び出し規則について心配する必要がなくなり、最終的なオブジェクト ファイルをより詳細に制御できます (つまり、各変数がどこに移動するか、どのレジスタに格納されるか、メモリに格納されるかを決定できます)。そのコードが優先されるためです。最適化できません (volatile キーワードを使用すると仮定します)。

2 番目の質問については、可能です。できることは、単純な C プログラムを作成し、それをアセンブリに変換することです。

gcc -S source.c

これと、アーキテクチャのマニュアル ( MIPS、Intel など) とGCCのマニュアルがあれば、長い道のりを歩むことができます。

オンラインでいくつかの資料があります。

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/

インライン アセンブリの欠点は、通常、異なるコンパイラ間でコードを移植できないことです。

それが役に立てば幸い。

于 2009-10-22T18:53:00.033 に答える
10

インライン アセンブリは、インプレースの最適化、およびライブラリやオペレーティング システムによって公開されていない CPU 機能へのアクセスに役立ちます。

たとえば、一部のアプリケーションでは、タイミングを厳密に追跡する必要があります。x86 システムでは、RDTSC アセンブリ コマンドを使用して内部 CPU タイマーを読み取ることができます。

タイムスタンプカウンター - ウィキペディア

インライン アセンブリで GCC または C/C++ コンパイラを使用すると、コードの小さなスニペットには便利ですが、多くの環境では適切なデバッグ サポートがありません。これは、インライン アセンブリが特定の機能を提供するプロジェクトを開発する場合により重要になります。また、インライン アセンブリを使用すると、移植性の問題が繰り返し発生します。適切な環境 (GNU アセンブラー、MASM) で特定のアイテムを作成し、必要に応じてそれらをプロジェクトにインポートすることをお勧めします。

于 2009-10-22T18:54:30.750 に答える
8

インライン アセンブリは通常、コンパイラによって公開されていないハードウェア機能 (組み込み関数が提供されていないベクトル SIMD 命令など) にアクセスするため、および/またはコンパイラが最適ではないコードを生成するコードのパフォーマンス クリティカル セクションを手動で最適化するために使用されます。

確かに、アセンブリ言語で記述したルーチンをインライン アセンブラを使用してテストすることを妨げるものは何もありません。ただし、コードの大きなセクションを作成する場合は、実際のアセンブラを使用して、関係のないことに行き詰まらないようにすることをお勧めします。ツールチェーンの残りの部分と一緒に GNU アセンブラがインストールされていることに気付くでしょう ;)

于 2009-10-22T18:51:11.400 に答える
3
  1. カスタム アセンブリ コードを埋め込む利点は、開発者がコンパイラよりも効率的なアセンブリ コードを記述できる場合があることです (あえて言いますが、多くの場合)。そのため、非常にパフォーマンスを重視するアイテムの場合、カスタム アセンブリが有益な場合があります。ゲームが思い浮かびがちですが……。

  2. 組み立てを学ぶためにそれを使用する限り、私はあなたができることに疑いの余地はありません. しかし、実際のアセンブリ SDK を使用する方が良い選択かもしれないと思います。言語の使用方法を学習する標準的な実験とは別に、開発環境のセットアップに関する知識が必要になるでしょう。

于 2009-10-22T18:52:28.477 に答える
2

これは実際には答えではありませんが、他の人々の答えに対する一種の拡張コメントです。

インラインアセンブリは、CPU機能にアクセスするために引き続き使用されます。たとえば、携帯電話で使用されるARMチップでは、さまざまなメーカーが、C /C++では同等のものがない通常とは異なる機械語命令を必要とする特別な機能を介して製品を区別しています。

80年代から90年代初頭にかけて、ループを最適化するためにインラインアセンブリを頻繁に使用していました。たとえば、当時680x0プロセッサを対象としたCコンパイラは、次のような非常に愚かなことをしていました。

calculate a value and put it in data register D1
PUSH D1, A7     # Put the value from D1 onto the stack in RAM
POP D1, A7      # Pop it back off again
do something else with the value in D1

しかし、最近のコンパイラははるかに賢いので、おそらく15年以内にそれを行う必要はありませんでした。実際、現在のコンパイラは、ほとんどの人間よりも効率的なコードを生成することがあります。特に、長いパイプラインや分岐予測などを備えたCPUを考えると、最も高速に実行される命令のシーケンスが、人間にとって最も意味のあるものであるとは限りません。したがって、「ABCDをこの順序で実行する」と言うと、コンパイラーは効率を高めるために順序をスクランブルします。

インラインアセンブラで少し遊んでも初心者には問題ありませんが、真面目な人なら、しばらくしてから「本物の」アセンブラに移行することを提案する人たちと同じです。

于 2009-10-23T01:49:31.843 に答える
2

inline asm機能を使用してアセンブリ言語を学習しないでください。

それが何に役立つかについては、主に難読化であるjldupontに同意します。理論的には、拡張 asm の複雑な構文により、レジスターの使用に関してコンパイラーと連携できるため、コンパイラーと簡単に統合できます。これにより、コンパイラーにこれとそれをメモリーからロードするように指示できます。そして最後に、このレジスタまたはそのレジスタを壊したことをコンパイラに警告することができます。

ただし、これらはすべて、標準に準拠した C コードを記述してからアセンブラー モジュールを記述し、拡張機能を通常の関数として呼び出すだけで実行できました。おそらくかなり前までは、プロシージャ コール マシンの操作は遅すぎて許容できませんでしたが、今日では気付かないでしょう。

本当の答えは、制約 DSL を知っていれば簡単だということだと思います。Makefile を変更して新しいモジュールをビルドおよびデプロイのワークフローに追加するという手間をかけるよりも、単にasmを投入して C プログラムを難読化するだけです。

于 2009-10-22T19:00:00.597 に答える
1
  1. 頻繁に実行されるループの手動最適化。この記事は古いものですが、手書きのアセンブリが使用される最適化の種類についてのアイデアを与えることができます。

  2. gccが直接使用するアセンブラを使用することもできます。それは呼ばれasます(を参照man as)。ただし、アセンブリに関する多くの本や記事は、DOSまたはWindows環境を使用していることを前提としています。したがって、Linux(仮想マシンでFreeDOSを実行している可能性があります)で学ぶのは難しいかもしれません。コーディングするプロセッサ(通常は公式マニュアルをダウンロードできます)だけでなく、OSに接続する方法も知っている必要があるからです。走っています。

DOSを使用した優れた初心者向けの本は、NortonとSochaによるものです。それはかなり古いので(第3版と最新版は1992年のものです)、0.01ドル(冗談なし)のような中古のコピーを手に入れることができます。私が知っているLinuxに固有の本は、無料の「ゼロからのプログラミング」だけです。

于 2009-10-22T19:19:29.343 に答える