機械語
機械語(きかいご)またはマシン語とは、CPUが理解できるプログラミング言語のこと。初期のコンピュータでは機械語しか存在せず、プログラムを組むと言うことは、この機械語を直接入力することであった。
CPUと機械語
CPUは、主記憶(メモリ)にある機械語で書かれたプログラムを読み取り、解析、実行、出力することで処理を行っている。全てのプログラミング言語で書かれたプログラムは、最終的に、この機械語に翻訳されないと実行することが出来ない。一概に機械語といっても、CPUの種類によって仕様が異なるので、あるプログラムが CPU Aで実行できたからといって、CPU Bでも実行できるとは限らない。仮に、CPU Cが CPU Aの仕様で書かれた機械語のプログラムを完全に実行できた場合、CPU Cは CPU Aと互換性がある、といえる。
ペンティアム系列とPowerPC系列の双方で動くプログラムが存在しないのは、これらのCPUの仕様に互換性が無いからである。例え同じ系列だとしても、新しい世代のCPUの為に作ったプログラムは古い世代のCPUでは動かないこともある。プログラムの互換性については、オペレーティングシステムにも関連することである。
機械語とアセンブリ言語
ファイルシステムが存在するコンピュータでは、この機械語で書かれた実行可能なプログラム(オブジェクトコード)を収めたファイルを、オブジェクトファイル(実行可能なバイナリファイル)と呼ぶ。このファイルの中身を、2進数を4bitずつ16進数に変換して表示すると、かろうじて認識が出来る状態になる。この状態でプログラムの内容が分かるような人は、まずいないが、特定のCPUについて、0と1の羅列を全て諳んじているという猛者も存在する。現在は人が機械語を扱うことは、汎用機や組み込みシステムでのダンプ解析のような特殊な状況以外ではまずなく、仮に機械語でのプログラムが必要な場合は、機械語とほぼ1対1に対応するニーモニック・コードを用いたアセンブリ言語を使うのが一般的である。
また、機械語を解読する場合には、オブジェクトファイルを読み込んで、対応するニモニックとラベルを出力する逆アセンブラが利用される。
互換性がない理由
CPUの種類によって機械語に互換性がないのにはさまざまな理由あるが、代表的なもに以下のようなものがある。 CPUが理解できる命令の種類や数が異なる(CISCとRISC) 命令の長さが異なる(CISCとRISCとでは長さが異なることがある。また、同じアーキテクチャでも、命令のビット数の違いも影響する) 命令部の命令番号が一致しない 同じ処理を行う命令でも処理結果が異なる 演算方法が異なる(レジスタ - レジスタ間演算やメモリ - レジスタ間演算の違い。RISCでは後者の演算ができない) データの記録方法が異なる(ビッグエンディアンとリトルエンディアン) 実行形式のバイナリファイルの記録形式が異なる(CFM CarbonとMach-O Carbon)
機械語の構成
CPUの種類によって機械語に互換性はないとはいえ、機械語がどのように構成されているかは大体決まっている。 命令部(オペレーションコード、あるいはオペコード)
- CPUに処理をさせるための命令の番号を記録している。機械語に互換性がないのは、主にこの番号が一致しないことに由来する。
- 情報として利用するデータが格納されているメモリアドレス、あるいはジャンプ命令でのジャンプ先、演算結果を記録すべき場所、場合によってはデータそのものを記録している。CPUや命令によって長さが異なる場合がある。オペランドの数に合わせて、0アドレス方式、1アドレス方式、2アドレス方式、3アドレス方式がある。0アドレス方式はオペレーションコードだけで、オペランドは存在しない。
- プログラム内部で利用するデータが記録されている部分。命令にオペランドがあるとここまでジャンプしてデータを取得/記録していく。通常はプログラムの下端に存在する。
コード例
情報処理技術者試験による仮想コンピュータCOMETにおける機械語の例を以下に挙げる。なお、この機械語コードは16進数表現であり、2バイト単位で区切ってある。
| アドレス | 機械語 | CASL | ||
|---|---|---|---|---|
|
8000 800C 800D |
7001 0000 7002 0000 1210 800D 1220 800C F000 0002 7120 7110 000C 0048 0065 006C 006C 006F 0020 0077 006F 0072 006C 0064 0021 |
LEN TEXT |
OUT DC DC |
TEXT,LEN 12 'Hello world!' |
関連項目
低級言語 リンカ コンパイラ アセンブラ
この記事はスタブ(書きかけ)です。この記事を加筆して下さる協力者を求めています。