2

警告 1:実際の実際の CPU 設計については何も知りません。

注意 2:「CPU 命令」、「CPU 操作」、「CPU 機能」などの用語の違いがわかりません。あるかもしれないし、ないかもしれないが、私はこれらを同義語のように使っている。私が間違っている場合は修正してください。

背景: 2 つのレジスタを持つ 4 ビット CPU があるとします。ここで、定数値をレジスタ 1 にロードする必要があります! これを行うにはいくつかの方法があります。

  • 0SXX のような命令。0 は「レジスタを X に設定する」種類の命令であることを示し、S はレジスタ 1 のどちら側に XX をロードするかを示します。
    • 長所: レジスタ 1 の操作が簡単です。2 バイトのプログラム メモリを使用して定数値を設定できます。
    • 短所: 可能な CPU 命令の半分を消費します。私の 4 ビットの小さなデバイスにとっては悲劇ですが、8 ビット以上のコンピュータにとっては大した問題ではないでしょう。
  • 純粋な算術/ビット単位の一連の CPU 関数 (AND、OR、NOT、XOR、RoR、RoL、INC など)
    • 長所: 追加の CPU 実装はありません。
    • 短所:より多くの命令が必要で、定数のロードが遅くなり、もちろん、アセンブリに定数をロードする前にもっと考える必要があります。
  • それらの間の何か?レジスターのクリア、??XX のロード、そして論理演算のように?
  • 私が考えていない他の何か?

一般的:

  • すべての通常の最新の CPU がレジスタを定数値に設定する方法はありますか?
    • いいえの場合、それを行う最も一般的な方法は何ですか?
  • 古い 4/8 ビット コンピュータでは、それを行う別の方法がありましたか?

組み立てに触れたことのある人なら分かると思います。あなたの助けに感謝します!前もって感謝します。

4

2 に答える 2

6

各プロセッサ アーキテクチャ、x86、アーム、ミップなどには、独自の方法があります。なんらかの方法で定数を操作できない場合、プロセッサを十分に活用することはできません。

何よりもまず、すべてのプロセッサがレジスタを使用するわけではありません。たとえば、スタックベースのプロセッサもあります。何らかの方法でスタックに定数を配置しても、同じ問題があります。

2 つの基本的なアプローチがあり、どちらもほとんどのプロセッサで使用されています。1つはあなたが暗示した線に沿ったもので、これはレジスタへの即時移動(定数が命令自体でエンコードされていることを意味する即時)であると述べている命令があります。用語は異なりますが、オペコード、レジスタ番号、即値はエンコードされています命令で。CPUによっては、1つの命令でレジスタ全体をロードできない場合がありますが、たとえば固定長の命令セットでは、オペコード、レジスタ番号、および32ビット値を32ビットに収めることができないため、たとえばARMとMIPSは一度にレジスタの一部のみをロードします。0x00000078 をロードしてから 0x00005600 をロードし、次に 0x00340000 をロードしてから 0x12000000 をロードするか、別のアーキテクチャで 0x00005678 をロードし、0x12340000 をロードすると、0x12345678 になります。

2 番目の方法は、多くの場合 .text と呼ばれるプログラム メモリに定数を配置し、PC 相対アドレッシングを使用してデータをメモリからレジスタにロードまたは移動する命令を使用することです。pc プログラム カウンター、基本的にはプログラマーとアセンブラー (アセンブリ言語を読み取り、そこから機械コードを作成するプログラム) の組み合わせが、ロードする命令とロードするデータを配置し、基本的に言うと、現在実行している命令に数値 X を追加すると、読み取りたい定数のアドレスが生成され、このレジスタにロードされます。この 2 番目のアプローチは、ほとんどの命令セットで利用でき、命令セットのルールに応じて、任意のサイズの定数を必要なレジスタにロードできるようになりました。固定命令長の命令セットの場合、必要な定数を組み合わせるのに2つまたは4つ以上の命令は必要ありません。パフォーマンスに影響する場合とそうでない場合があるメモリサイクルがかかります。可変長の命令セットについて考えると、定数自体は命令フロー内の個別の読み取りであるため、アーキテクチャ間のトレードオフは実際には違いはありません。

命令セットがどれだけ古くても新しいものであっても、歴史的に類似しているかどうかは問題ではありません。古いものから新しいものまでの命令セットは、数個以上のレジスタを使用する傾向があり、プログラム カウンターを持ち、ALU 演算を持ち、加算および、または、xor などを使用しません。メモリを読み書きする方法 (ロードとストア) を持ち、即値を使用する機能。古いciscプロセッサおよび/または可変長命令セットプロセッサは、これらの命令をより多く提供し、すべてのalu操作は全幅の即値を使用する機能を備えていました。リスクでパフォーマンスを向上させようとすると、犠牲になりますこれらの機能により、パイプライン処理が高速になり、命令が増えますが、より高速でスムーズに移動し、全体的に高速な実行 (またはその他の機能) が生成されます。

命令セットの情報は、ネット上に公開されています。pdp-11 または msp430 は最初の適切な命令セットです。アセンブリを学習するときは、ハードウェアではなくシミュレーターを使用することをお勧めします。最初は x86 を使用しないでください。msp430/pdp11、arm、mips、avr など。1 つまたは 2 つの pdp8 は実際に興味深く、教育的です。もちろん、4004 または 8008 を掘り起こし、6502、6800、および 8080 に進みたいと思うかもしれません。などなど。

于 2013-08-04T15:51:46.527 に答える