23

私は一般的にアセンブリプログラミングを研究しているので、ソフトウェアに「仮想マイクロプロセッサ」を実装することにしました。これには、変数と配列を使用して実装されるレジスタ、フラグ、RAMが含まれています。しかし、マイクロプロセッサの最も基本的な動作のみをシミュレートしたいので、基本的な命令のみを含み、それなしでは役に立たない命令のみを含むアセンブリ言語を作成したいと思います。つまり、乗算やレジスタ値の交換などを実行できるアセンブリ言語がありますが、これらの操作は、より簡単な命令を使用して実装できるため、基本的なものではありません。私はそのような命令を実装したくありません。

バイトを移動するMOVや命令ポインタを別のアドレスに送信するJPなど、アセンブリ言語には常に存在しなければならない命令がいくつか想像できます。

最も基本的で重要な組み立て手順のセットを提案できますか?ありがとう!

4

8 に答える 8

9

制御構造は、言語がない基本機能を構成します。これは、言語が2つの変数に対して算術演算を提供する必要があることを意味します。次に、プログラムが操作の結果に基づいてプログラムカウンターを変更できるようにします(つまり、分岐します)。多くの場合、重要な演算はSUBであり、あるオペランドを別のオペランドから減算します。また、ブランチを許可する条件は次のとおりです。

  1. 結果はゼロです。
  2. 結果はゼロより大きい;
  3. 結果はゼロ未満です。
  4. 条件なし、つまり無条件​​の分岐

また、データを移動するための指示も必要です。たとえば、LOADとSTOREです。

これらの3つの条件とそれに対応するブランチ(またはスキップ、これを行う別の方法)は、どのプログラムにも必要です。それだけでなく、これら3つの簡単な操作とデータ移動命令だけで、I/O以外のプログラムで何でも実行できます。必要に応じて、協調するメモリ構成があれば、LOAD、STORE、ADD、SUB、および3つの条件分岐だけを使用してLinuxを書き直すことができます。

PDP-8は、これよりもはるかに強力なマシンでした。I /Oを含む8つの命令の豊富なセットがありました。

HTH

于 2012-02-24T22:50:00.663 に答える
8

まあ、これは非常に広い主題です。私はあなたがランダムアクセスマシンに精通する必要があると思います。私は専門家ではありませんが、この非常に基本的なマイクロプロセッサでどの命令をサポートする必要があるかを判断するのは困難です。例:減算と乗算は、加算演算によってシミュレートできます。マイクロプロセッサがジャンプと条件付き命令をサポートしている場合は乗算が可能であり、負の数を加算することで減算が可能です。

于 2012-02-24T22:35:11.840 に答える
7

驚いたことに、 1つの命令セットコンピュータのようなものがあります。

于 2012-02-24T23:04:06.467 に答える
7

最小の命令セットは、命令を必要としないか、おそらくゼロの命令を必要とします。それらが実際のデバイスに組み込まれたかどうかはわかりませんが、 One Instruction Set Computer(OISC) が実装され、カーボンナノチューブコンピューターMAXQで正常に実行されています。

実際、x86はチューリング完全であることが証明されているため、1つで何でもできるmovため、OISCアーキテクチャとしても使用できます。有効なCコードをMOVのみ(またはXOR、SUB、ADD、XADD、ADC、SBB、AND / OR、PUSH / POP、1ビットシフト、CMPXCHG /のいずれか)でプログラムにコンパイルするmovfuscatorという名前のコンパイラもあります。 XCHG)。移動が完了した理由を参照してください。


ただし、IMOアーキテクチャは、有用であると見なされるために十分に「高速」である必要があります(または、他のアーキテクチャと比較して、タスクにOISCのような多くの命令を必要としない)。

コンピュータの最も基本的な命令タイプは、データ移動、論理/算術演算、および分岐です。算術演算の場合は、1つadd/subtractで十分です。NORロジックの場合、またはだけで任意の関数を計算できるNANDため、必要な関数は1つだけです。ジャンプするには、1つjump on "<="またはjump on "<"命令が必要です。データの移動は、add/subによってエミュレートできます。このように、2ビットを使用して3つのオペコード(、、)をエンコードaddnandjump on "<="将来の拡張のために1つを残すことができます。ただし、これには個別のロード/ストア命令がないため、メモリではなく大きなレジスタファイルを直接操作するか、命令がメモリをオペランドとして使用できる必要があります。

より高速が必要な場合は、ロジック、分岐命令、場合によってはロード/ストアを追加して、オペコードスペースを3ビットに増やすことができます。命令セットは次のとおりです。

  1. ロード
  2. お店
  3. 追加
  4. または
  5. 未満にジャンプ
  6. 平等にジャンプ

左シフトはで行うことができますaddが、右シフトは難しいので、いくつかの一般的な操作を容易にするために右シフトを追加することもできます

于 2013-10-30T08:58:00.473 に答える
4

SOB:減算1と分岐のみで構成される最小限の命令セットで完全にうまく生き残ることができます。プログラム全体がこれで作成でき、作成されています。

于 2013-10-30T09:02:58.137 に答える
3

商用実装を見てください

最良の答えは、既存の商用実装を検討する可能性があります。

商業的に販売されていないものは、役に立たない可能性があります。

命令の定義は何ですか?

たとえば、unzipのハードウェア実装に基づいて、unzipアルゴリズムを実装する1つの命令を作成できます。もちろん、これは解凍に可能な最も効率的なマシンです。

しかし、それは商業的に魅力的でしょうか?可能性は低いですが、そのハードウェアはおそらく専門性が高すぎて開発コストを正当化できないためです。

しかし、この極端なケースよりもはるかに微妙なケースがあり、その答えは、状況をさらに悪化させるために、既存の競合他社のテクノロジーや市場の需要によって異なる可能性があります。

結局のところ、「効率的なハードウェア」とは次のことを意味します。

  • 一連のベンチマークを取得し、それぞれに1つの重要度の重みを割り当てます
  • それらのベンチマークを解決する最適なソフトウェアを作成する

非常に小さなチューリング完全ISAが非効率的である可能性がある理由として考えられる

  • 彼らが持っているいくつかの指示は非常に複雑であり、呼び出されるたびに大きなコストがかかります。たとえば、特定のパイプライン最適化を行うことはできません。
  • コード密度は非常に小さいため、次のことを意味します。
    • パフォーマンスは、命令フェッチによって制限される場合があります
    • ROMメモリが小さい組み込み機器には適していません

注目すべきOISCの実装

それらを分析して、より具体的な答えを得るのは興味深いことです。

movfuscator

https://github.com/xoreaxeaxeax/movfuscator

x86命令のみを使用するx86用のToyCコンパイラーはmov、1つの命令で十分であることを非常に具体的に示しています。

チューリング完全性は論文で証明されているようです:https ://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

subleq

教育用OSIC、以前はhttps://stackoverflow.com/a/9439153/895245で言及されていましたが、名前はありません:

参照: https ://esolangs.org/wiki/Subleq

も参照してください

https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501

于 2017-04-23T11:28:47.960 に答える
2

理論的には、単一の命令コンピュータが可能です。ただし、実際のハードウェアでは、最低4つ必要です。メモリのみのアーキテクチャ(ユーザーがアクセスできるレジスタがない)を想定しています。

MOV mem1 mem2-メモリ位置mem1の内容をメモリ位置mem2にコピーし、mem1は変更しないでください

NAND mem1 mem2からmem3-mem1とmem2のデータ間でビット単位の論理NANDを実行し、結果をmem3に書き込みます。

BITSHIFTR mem1 mem2 mem3- mem1 mem2の場所にあるデータを右にビットシフトし、出力をmem3に書き込みます。

JMPcond mem1 mem2-mem1で最下位ビットをテストし、それがtrue(1)の場合はmem2にジャンプします。

今では超高速ではなく、狂ったようにメモリ帯域幅を消費しますが、任意の命令セットを使用して仮想マシンを実装するために使用できます。さらに、すべての開始データでプログラムする必要がある、または少なくともLSBのみが1に設定されているメモリ位置など、特定のプログラミング上の制約があります。ハードウェア周辺機器は、I / OアクセスにDMAを使用する必要があり、ハーバードアーキテクチャでは、プログラムはポインタなどに直接アクセスできません。

于 2018-05-02T01:14:36.250 に答える
1

チューリング完全性を調べることもできます。

http://en.wikipedia.org/wiki/Turing_completeness

http://c2.com/cgi/wiki?TuringComplete

チューリング完全とは何ですか?

これは、計算できるものはすべて言語で十分に計算できることを意味します。

于 2012-09-12T16:49:31.400 に答える