4

などのさまざまなオープンソースアセンブラがあります。それらは異なる構文pseudo-opsを持っています。macro多くのオープンソースプロジェクトでは、定数とプラットフォーム条件を置き換えるためにアセンブラが前処理されています。

変換パフォーマンス(バイナリ時間へのコンパイル/アセンブル)を除い て、現在のすべてとgccを使用できると仮定すると、アセンブラを作成する際にどのような制限がありますか?attributes#pragmas

について話しているのではありません。

 #define MOV(RA,RB)  (OXFEB10000UL | RA << 16 | RB)  
 #define ADD(RA,RB)  (OXFEB20000UL | RA << 16 | RB)  
 #define RET         (OXFEB7ABCDUL)  

 unsigned long add4[] __attribute(section(".text")) =
 {
    ADD(R0,R1),
    ADD(R2,R3),
    MOV(R1,R2),
    ADD(R0,R1),
    RET()
 };

ポインタ演算を使用すると、.およびその他のシミュレーションが可能になると思いますlabels。おそらくこれはXY問題です; なぜアセンブラーが多いのかを理解しようとしています。すべてがプリプロセッサで実行できるようで、アセンブラは実際にはプログラマの好みです。または私が見逃している技術的限界があります。

これは、「シェルコードではできないアセンブラでできること」に関連しているのではないかと思います。

編集:これをCからコンパイラに再タグ付けしました。アセンブラの技術的な詳細に興味があります。それは単に1-1翻訳と再配置の発行(コンパイラーのように)ですか、それとももっとありますか?上で概説したように、人々がアセンブラーをコーディングするという意味ではありません。私はアセンブラーが何をしているのかを理解しようとしています。アセンブラー向けのドラゴンブックはないと思います。もちろん、プリプロセッサはbinaryそれ自体で作成することはできず、追加の機械が必要です。テキストのみを翻訳します。

4

2 に答える 2

4

XY問題は間違った説明だと思います。問題は、「コンセプトBを評価するにはコンセプトAが必要」ということです。


コンセプトA:アセンブラーとは何ですか?

参照:DavidSolomonによるアセンブラとローダー。[いくつかの知恵の真珠、いくつかの古風な雑学]

私はすぐにこの分野の文献の不足を発見しました。幅広い文献が存在するコンパイラとは厳密に対照的に、アセンブラとローダーについてはほとんど書かれていません。

アセンブラは、

  • いくつかのオブジェクト形式を介したリンクを容易にするシンボルテーブル。
  • テキストをデータ構造に、または直接マシンコードに変換するためのレクサーパーサー。
  • 最も効率的な分岐およびサブルーチン呼び出しのために2パスを実行します。
  • オペコードテーブル。

アセンブラは一般的に1-1翻訳です。ただし、多くの場合、ブランチと呼び出しのいくつかのバリエーションが存在します。一般的にロングバージョンとショートバージョンとして知られています。使用されるオペコードは、宛先までの距離によって異なります。フォワードブランチを最適化するには、2パスコンパイラが必要です。ハロルドにほのめかされた


コンセプトB:「C」プリプロセッサをアセンブラとして使用する。

「C」プリプロセッサがエミュレートできる最高のものは、1パスアセンブラです。大規模なクラスのCPU/命令はこのようにエンコードできます。マクロは面倒かもしれませんが。リスト外部参照はありませんが、ほとんどの人はこれらの機能を見逃すことはありません。また、プリプロセッサの制限により、構文がおかしくなります。#defineラベルはポインタを使用して「C」シンボルテーブルを再利用するか、ラベルオフセット用に手動でコーディングするため、アドレス修正を処理するのは困難です。これにより、このアプローチは基本ブロック以外のものに制限されます。

大規模なアセンブラルーチン

YUV/RGB変換やMP3デコードなどの大規模なアセンブラルーチンがこのように使用される可能性はほとんどありません。

マルチアーチコード

複数のアーキテクチャコードは非常に一般的です。たとえば、ARM Wi-Fiチップには、そのコードがファームウェアとしてLinuxカーネルに埋め込まれている場合があります。この手法がここで役立つ可能性があります。ただし、アーキテクチャごとに別々のコンパイラ/アセンブラを使用objcopyしてから、それらを埋め込むために使用する方がはるかに適切です。

自己修正コード

これはおそらく最も便利です。実際、リンカーやローダーなどの多くのツールには、実行時にコードにパッチを適用する高レベルの関数があります。また、実行時にルーチンを条件付きで変更するために使用することもできます。関数ポインタは、キャッシュコヒーレンシの問題は言うまでもなく、ほぼ同じくらい高速で理解しやすいものです。

参照:IanLanceTaylorによるGoldBlog。[彼は使用していますが<templates>]

于 2013-03-21T03:09:36.677 に答える
3

アセンブラ [...] を作成する gcc にはどのような制限がありますか?

多くの。アセンブルにアセンブラを使用し、前処理に C プリプロセッサを使用するのには理由があります。

まず、自分で示したばかりのように、Intel や AT&T のスタイルの通常のアセンブラー構文を使用することはできません。これらの醜い括弧を使用する必要があります。

第二に、__attribute__あなたが話しているディレクティブはプリプロセッサとは何の関係もなく、認識さえしません。これらはコンパイラのヒントであり、コンパイラはこれらの属性に基づいて (またはそうでなくても) アセンブリ コードを生成します。

おそらくこれはXY問題です

それは確かです。

なぜアセンブラが非常に多いのかを理解しようとしています。

同じ理由で、さまざまな種類のプログラミング言語、コンパイラ、車、服が世の中に出回っています。1 つのツールがすべての人のニーズに合うわけではありません。人々は異なり、ツールチェーンで異なることを行い、一方が他方よりも使いやすいと感じています (個人的には、サポートできない AT&T 構文が必要ない場合は GNU アセンブラーを使用します)。等

于 2013-03-17T20:46:27.097 に答える