高レベルの理由
あなたがそれについて考えるとき、マイクロプロセッサは驚くべきことをします:それはあなたが機械(洗濯機やエレベーターなど)を取り、安価で大量生産されたシリコンでカスタム設計されたメカニズムまたは回路のチャンク全体を置き換えることを可能にしますチップ。部品に多くのお金を節約し、設計に多くの時間を節約できます。
しかし、数え切れないほどのカスタムデザインに取って代わる標準チップです。すべてのアプリケーションに最適な単一の完璧なマイクロプロセッサは存在できません。一部のアプリケーションでは、電力使用量を最小限に抑える必要がありますが、高速である必要はありません。他のものは高速である必要がありますが、プログラムが簡単である必要はなく、他のものは低コストである必要があります。
したがって、マイクロプロセッサにはさまざまな「フレーバー」があり、それぞれに長所と短所があります。全員が互換性のある命令セットを使用することが望ましいです。これにより、コードの再利用が可能になり、適切なスキルを持つ人材を見つけやすくなります。ただし、命令セットは、プロセッサのコスト、複雑さ、速度、使いやすさ、および物理的制約に影響するため、妥協点があります。「主流」の命令セット(およびマイナーな命令セット)がいくつかあり、各命令セット内には、異なる特性を持つ多くのプロセッサがあります。
ああ、技術が変化すると、これらのトレードオフがすべて変化するため、命令セットが進化し、新しいセットが出現し、古いセットが消滅します。たとえ今日の「最高の」命令セットがあったとしても、それは20年ではないかもしれません。
ハードウェアの詳細
おそらく、命令セットでの最大の設計決定はワードサイズ、つまりプロセッサが「自然に」操作できる数値の大きさです。8ビットプロセッサは0〜255の数値を処理し、32ビットプロセッサは0〜4,294,967,295の数値を処理します。ある人のために設計されたコードは、別の人のために完全に再考される必要があります。
ある命令セットから別の命令セットに命令を変換するだけの問題ではありません。異なる命令セットでは、完全に異なるアプローチが望ましい場合があります。たとえば、8ビットプロセッサではルックアップテーブルが理想的ですが、32ビットプロセッサでは算術演算が同じ目的に適しています。
命令セットには他にも大きな違いがあります。ほとんどの指示は4つのカテゴリに分類されます。
- 計算(算術と論理)
- 制御フロー
- データ転送
- プロセッサ構成
プロセッサは、実行できる計算の種類と、制御フロー、データ転送、およびプロセッサ構成へのアプローチ方法が異なります。
たとえば、一部のAVRプロセッサは乗算も除算もできません。一方、すべてのx86プロセッサーは可能です。ご想像のとおり、乗算や除算などのタスクに必要な回路を削除すると、プロセッサがよりシンプルで安価になります。これらの操作は、必要に応じてソフトウェアルーチンを使用して実行できます。
x86では、算術命令がオペランドをメモリからロードしたり、結果をメモリに保存したりできます。ARMはロードストアアーキテクチャであるため、メモリにアクセスするための専用の命令がいくつかあります。一方、x86には専用の条件分岐命令がありますが、ARMでは事実上すべての命令を条件付きで実行できます。また、ARMではほとんどの算術命令の一部としてビットシフトを実行できます。これらの違いは、パフォーマンス特性の違い、チップの内部設計とコストの違い、アセンブリ言語レベルでのプログラミング手法の違いにつながります。
結論
ユニバーサルアセンブリ言語を使用できないのは、アセンブリコードをある命令セットから別の命令セットに適切に変換するには、コードを最初から設計し直す必要があるためです。コンピューターではまだできません。