任意のプログラムを実行するために使用されるプロセッサを構築する場合、最小の命令セット (ISA) は何ですか?
私が考えていた:
ALU-ops (add、sub、mul、div)
ロードレジスタ、[アドレス]
店舗登録、[アドレス]
分岐 if 操作。等しくない場合、>、< の場合 (branchif reg1, reg2, LABEL)
どう思いますか?
任意のプログラムを実行するために使用されるプロセッサを構築する場合、最小の命令セット (ISA) は何ですか?
私が考えていた:
ALU-ops (add、sub、mul、div)
ロードレジスタ、[アドレス]
店舗登録、[アドレス]
分岐 if 操作。等しくない場合、>、< の場合 (branchif reg1, reg2, LABEL)
どう思いますか?
技術的には、 One Instructionだけが必要です。数学と条件分岐を行う必要があります。たとえば、負の場合は減算して分岐します。
他の命令から構築できる命令は必要ありません。
したがって、加算mul
またはdiv
減算を繰り返すことでそれを行う必要はありません。また、2の補数のように、(否定)数が折り返されるsub
場合も必要ありません。neg
そして確かに、 2つの分岐命令で逃げることができます。1つは等しい、もう1つはより小さい命令です。他のすべてはそれらの組み合わせから構築できます。
I / O命令がないため、他のデバイスとの通信がメモリアクセスを介する場合は、メモリマップドI/Oを使用する必要があります。
また、ネイティブpush
とpop
がない場合は、専用のレジスタ(およびレジスタ間の移動がないように見えるためメモリの場所)を使用して独自のスタックを実装する必要があります。
これはあまり良いアーキテクチャではありませんが、機能するはずです。マトリックスアーキテクトが述べたように、「私たちが受け入れる準備ができている生存のレベルがあります」。
余談ですが、RCA1802 CPUを調べてください(昔から)。専用のプログラムカウンターやスタックポインターはなく、代わりにすべてをソフトウェアで実装していました(詳細はこちらをご覧ください)。
8085 でプログラミングしているときに、同じことを行う方法がいくつかあると感じました。したがって、この場合、命令セットが最小ではないことがわかります。
次の手順を提案します-追加、補完、論理AND、OR、およびストアのロード。条件付きジャンプと無条件ジャンプ。
他の命令のほとんどは、上記の命令で実行できます。
編集:組み立て手順をリストするだけです(8085に基づく):
レジスタが 3 つあるモデルを考えます。A = B + C のような操作で
ADD B, C (A = B + C)
CMA (A = A')
OR B, C (A = B OR C) JMP xxxx (PC を xxxx に設定)
LDA xxxx (A に xxxx アドレスの内容をロード)
STA xxxx
JZ xxxx (ゼロフラグがセットされていればジャンプ)
注: レジスタ間でデータをコピーするための追加の命令が非常に役立つことを認識しています。でも省略可。なくてはならないケースをご提示ください。