機械語
マシンコードとは、機械語で書かれたコンピュータプログラムのこと。特定のコンピュータ・アーキテクチャの命令セットを使用します。通常はバイナリで記述される。マシンコードは、ソフトウェアの最下位レベルです。他のプログラミング言語は、コンピュータが実行できるようにマシンコードに翻訳されます。
命令は、プロセスにどのような操作を行うかを伝えるものです。各命令は、オペコード(オペレーションコード)とオペランドで構成されています。オペランドは通常、メモリアドレスやデータです。命令セットとは、コンピュータが使用できるオペコードのリストのことである。マシンコードとは、アセンブリコードやその他のプログラミング言語をコンパイルしたり、解釈したりするためのものです。
プログラムビルダーは、コードを別の言語やマシンコードに変換する。マシンコードはネイティブコードと呼ばれることもある。これは、一部のコンピュータでしか動作しないものを指すときに使われる。
マシンコードの書き込み
マシンコードは、さまざまな形式で記述することができます。
- いくつかのスイッチを使う。これは、1と0のシーケンスを生成します。これは、コンピュータの初期に使用されていました。1970年代以降、使われなくなりました。
- ヘックスエディターの使用。これにより、コマンドの番号ではなく、オペコードを使用することができます。
- アセンブラの使い方。アセンブリ言語はオペコードよりも簡単です。その構文は機械語よりは理解しやすいですが、高級言語よりは難しいです。アセンブラは、自分でソースコードを機械語に翻訳します。
- 高水準プログラミング言語を使用すると、読み書きしやすいコードを使用したプログラムが作成できます。これらのプログラムは機械語に翻訳されます。翻訳は多くの段階を経て行われます。Javaプログラムは、まずバイトコードに最適化されます。その後、使用する際に機械語に翻訳されます。


初期のミニコンピュータのフロントパネル(マシンコード入力用のスイッチがある
マシンコードの代表的な命令
命令セットには、さまざまな種類の命令が含まれています。
- 算術的な操作。加算、減算、乗算、除算。
- 論理的な操作。接続詞、離接詞、否定。
- 単一のビットに作用する操作。左または右にビットをシフトする。
- メモリに作用する操作:あるレジスタから別のレジスタへの値のコピー。
- 2つの値を比較する操作:大きいより、小さいより、等しい。
- 他の演算を組み合わせた演算:加算、比較、ある値と等しければコピー(1つの演算として)、レジスタがゼロであればプログラムのある時点にジャンプする。
- プログラムの流れに作用する操作:どこかのアドレスにジャンプする。
- データ型を変換する操作:例えば、32ビットの整数を64ビットの整数に変換したり、浮動小数点値を(切り捨てて)整数に変換したりすることができます。
最近のプロセッサの多くは、コマンドの一部にマイクロコードを使用しています。より複雑なコマンドはそれを使う傾向があります。これはCISCアーキテクチャでよく行われます。
説明書
すべてのプロセッサまたはプロセッサファミリーは、独自の命令セットを持っています。命令とは、マシンに与えることのできるさまざまなコマンドに対応するビットのパターンです。したがって、命令セットは、(ほとんど)同じアーキテクチャを使用するプロセッサのクラスに固有のものとなります。
新しいプロセッサの設計では、先行するプロセッサのすべての命令が含まれていることが多く、さらに命令が追加されることもあります。完全に互換性のあるプロセッサであっても、いくつかの命令については若干異なる動作をすることがありますが、これが問題になることはほとんどありません。
また、システムは、メモリの配置、オペレーティングシステム、周辺機器など、その他の詳細についても異なる場合があります。プログラムは通常このような要素に依存しているため、同じ種類のプロセッサーを使用していても、異なるシステムでは同じマシンコードを実行することはできません。
ほとんどの命令には、1つまたは複数のオペコードフィールドがあります。これらのフィールドは、基本的な命令タイプを指定します。他のフィールドでは、オペランドのタイプやアドレッシング・モードなどを指定します。また、オペコード自体に含まれる特別な命令もあります。これらの命令は即席と呼ばれる。
プロセッサーのデザインは、他にもさまざまな点で異なります。異なる命令は異なる長さを持つことができます。また、同じ長さのものもあります。すべての命令を同じ長さにすると、デザインがシンプルになります。
例
MIPSアーキテクチャでは、32ビット長の命令が用意されています。このセクションではコードの例を紹介します。一般的な命令の種類は、op(オペレーション)フィールドにあります。これは最上位の6ビットです。Jタイプ(ジャンプ)とIタイプ(即値)の命令は、opで完全に与えられる。Rタイプ(レジスタ)の命令は、フィールドfunct.これはコードの正確な動作を決定します。これらのタイプで使われるフィールドは
6 5 5 5 6ビット [ op|rs|rt|rd|shamt|funct ] Rタイプ [ op|rs|rt|address/immediate ] Iタイプ [ op|target address ] Jタイプrs, rt, rdはレジスタのオペランドを示し、shamtはシフト量を示す。アドレスまたは即値フィールドは、オペランドを直接格納します。
例:レジスター1と2を加算する。結果をレジスタ6に入れます。エンコードされます。
[ op|rs|rt|rd|shamt|funct] 0 1 2 6 0 32 decimal 000000 00001 00010 00110 00000 100000 binaryレジスタ8に値をロードする。レジスタ3に記載されている場所の68セル後のメモリセルから取り出します。
[ op|rs|rt|address/immediate] 35 3 8 68 decimal 100011 00011 01000 00000 00001 000100 binary1024のアドレスにジャンプします。
[ op | target address ] 2 1024 decimal 000010 00000 00000 00000 10000 000000 binary関連ページ
- 2進法による数値入力
- 量子コンピュータ
- 命令セット
- 縮小命令セットコンピュータ
質問と回答
Q:マシンコードとは何ですか?
A:マシンコードとは、特定のコンピュータアーキテクチャーの命令セットを使用して、機械語で書かれたコンピュータプログラムのことで、通常は2進数で記述されます。
Q: ソフトウェアの最下層とは何ですか?
A:マシンコードはソフトウェアの最下位レベルです。
Q:他のプログラミング言語はどのようにコンピュータで実行されるのですか?
A:他のプログラミング言語は、コンピュータが実行できるマシンコードに翻訳されます。
Q: 機械語コードの命令は何から構成されていますか?
A:機械語の命令は、オペコード(オペレーションコード)とオペランド(複数可)で構成されています。オペランドは通常、メモリアドレスやデータです。
Q: 命令セットとは何ですか?
A: 命令セットとは、コンピュータで使用可能なオペコードのリストのことです。
Q:プログラムビルダーはコードをどのように扱うのですか?
A:プログラムビルダーは、コードを別の言語やマシンコードに変換します。
Q:マシンコードの別の呼び名は何ですか?
A:マシンコードはネイティブコードと呼ばれることもあり、一部のコンピュータでしか動作しないものについて話すときに使われます。