機械語
機械語の最新ニュースをまとめて検索!
機械語(きかいご)またはマシン語とは、CPUが直接理解し実行できるプログラミング言語であり、実体は2値の電気信号の集まりである。人が使う場合は数字と一部英字を使い2進数や16進数などで表現される、最も低いレベルのプログラム言語といえる。かつて、コンピュータには機械語以外のプログラミング言語が存在せず、プログラムを組むことは、この機械語を直接入力することである時期があった。
目次 |
[編集] CPUと機械語
CPUは、主記憶装置にある機械語で書かれたプログラムを読み取り、解析、実行、出力することで処理を行っている。すべてのプログラミング言語で書かれたプログラムは、最終的にこの機械語に翻訳されないと実行することが出来ない。
一概に機械語といっても、静的リンクによるコンパイラ方式では機械語へコンパイルされただけでリンクされていない「オブジェクト・コード」の状態ではまだCPUは実行することが出来ず、リンカによって外部参照された関数名などからライブラリのオブジェクト・コードを付加したりすることでCPUが実行可能な「ロード・モジュール」(実行可能形式)となる。また、CPUの種類によって仕様が異なるので、あるプログラムが CPU Aで実行できたからといって、CPU Bでも実行できるとは限らない。CPU Cが CPU Aの仕様で書かれた機械語のプログラムを完全に実行できた場合、CPU Cは CPU Aと互換性がある、といえる。
Pentium系列とPowerPC系列の双方で動くプログラムが存在しないのは、これらのCPUの仕様に互換性が無いからである。たとえ同じ系列だとしても、新しい世代のCPUのために作ったプログラムは古い世代のCPUでは動かないこともある。プログラムの互換性については、オペレーティングシステムにも関連することである。
[編集] 機械語とアセンブリ言語
ファイルシステムが存在するコンピュータでは、機械語で書かれたプログラムは、実行ファイル(実行可能なバイナリファイル)として存在することが多い。21世紀現在、使用されているすべてのコンピュータは、実行すべき命令列を2進数データの組合せで論理的意味を持つ機械語のファイルとして読み込んで実行している。機械語で書かれたプログラムファイルを人が読めるようにするには、2進数を4bitずつ16進数に変換して表示することが多く、この"0"から"F"までの文字が羅列された印刷出力は「ダンプリスト」と呼ばれる。この状態でプログラムの内容が分かるような人はほとんど存在しないが、初期のコンピュータ技術者の中には、特定のCPUの機械語による命令体系を覚えていて、16進数の状態で内容を読み取ってしまえる者もいる。
現在は人が機械語を扱うことは、メインフレームや組み込みシステムでのダンプ解析のような特殊な状況以外ではありえず、仮に機械語でのプログラムが必要な場合は、機械語とほぼ1対1に対応するニーモニックを用いたアセンブリ言語を使うのが一般的である。また、機械語を解読する場合には、オブジェクトファイルを読み込んで、対応するニーモニックとラベルを出力する逆アセンブラが利用され、この行為をディスアセンブルという。アセンブリ言語を機械語に変換するアセンブラが作られていないか、あっても高価だった時代には、機械語の表を片手にダンプリストを眺めながら、プログラムを開発・保守することが一般的であった。このようにニーモニックと番地・定数から16進数を作る行為をハンドアセンブルという。
[編集] 構成
CPUの命令体系の違いによって系列の異なるCPU同士での機械語に互換性はないが、多くのCPUにおいて機械語の構成は以下のような形式を取る。
- 命令部(オペレーションコード、あるいはオペコード)
- CPUに処理をさせるための命令の番号を記録している。
- アドレス部(オペランド)
- 情報として利用するデータが格納されているメモリアドレス、あるいはジャンプ命令でのジャンプ先、演算結果を記録すべき場所、場合によっては定数を記録している。命令によって長さが異なり、オペランドの数に合わせて、0アドレス方式、1アドレス方式、2アドレス方式、3アドレス方式がある。0アドレス方式はオペレーションコードだけで、オペランドは存在しない。
- データ部
- プログラム内部で利用するデータが記録されている部分。命令にオペランドがあるとここまでジャンプしてデータを取得/記録していく。通常はプログラムの下端に存在する。
ごく単純なCPUや初期のCPU、架空のCPUを除けば命令の種類によってアドレス部やデータ部、そして中には命令部までも長さが変わることで、機械語の命令語長は可変になっている。異なる命令語長やいかなる命令体系であっても、最初にCPUが読み込むのは命令部であり、固定語長のものを除けば命令部からアドレス部やデータ部、そして拡張命令部の配置を読み取る。このため、読み込み位置が1バイトずれれば機械語の命令はそれ以降のすべての命令が正しく読み込まれず意味を失う。(例外的に"NOP"という「何もしない」命令では、ずれても問題は生じない。)
[編集] CPUによる仕様の差異
上記類似点の範囲でのCPUごとの機械語の仕様の差異には、以下のようなものが挙げられる。
- CPUが理解できる命令の種類や数が異なる(CISC、RISC、VLIW)
- 命令の長さが異なる(CISCとRISCとでは長さが異なることがある。また、同じアーキテクチャでも、命令のビット数の違いも影響する)
- 命令部の命令番号が一致しない
- 同じ処理を行う命令でも処理結果が異なる
- 演算方法が異なる(レジスタ - レジスタ間演算やメモリ - レジスタ間演算の違い。RISCでは後者の演算ができない)
- データの記録方法が異なる(エンディアンやアラインメントの相違)
- 実行形式のバイナリファイルの記録形式が異なる(PE、COFF、ELFなど)
[編集] コード例
情報処理技術者試験による仮想コンピュータCOMETにおける機械語の例を以下に挙げる。なお、この機械語コードは16進数表現であり、2バイト単位で区切ってある。
| アドレス | 機械語 | CASL | ||
|---|---|---|---|---|
|
8000 |
7001 0000 7002 0000 |
|
OUT |
TEXT,LEN |

