各プロセッサ アーキテクチャ、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 に進みたいと思うかもしれません。などなど。