Fascination N−D−File 機械語

戻る


いまどきのプログラム言語の作り方


プログラミング未経験者のための基本情報技術者
午後[プログラム言語]



やさしいJava 第3版(やさしいシリーズ)

機械語きかいご)またはマシン語とは、CPUが直接理解し実行できるプログラミング言語であり実体は2値の電気信号の集まりである。人が使う場合は数字と一部英字を使い2進数や16進数などで表現される最も低いレベルのプログラム言語といえる。かつて、コンピュータには機械語以外のプログラミング言語が存在せず、プログラムを組むと言うことは、この機械語を直接入力することである時期があった。

CPUと機械語

CPUは、主記憶(メモリ)にある機械語で書かれたプログラムを読み取り、解析、実行、出力することで処理を行っている。全てのプログラミング言語で書かれたプログラムは、最終的に、この機械語に翻訳されないと実行することが出来ない。

一概に機械語といっても、CPUの種類によって仕様が異なるので、あるプログラムが CPU Aで実行できたからといって、CPU Bでも実行できるとは限らない。CPU Cが CPU Aの仕様で書かれた機械語のプログラムを完全に実行できた場合、CPU Cは CPU Aと互換性がある、といえる。

Pentium系列とPowerPC系列の双方で動くプログラムが存在しないのは、これらのCPUの仕様に互換性が無いからである。たとえ同じ系列だとしても、新しい世代のCPUの為に作ったプログラムは古い世代のCPUでは動かないこともある。プログラムの互換性については、オペレーティングシステムにも関連することである。

機械語とアセンブリ言語

ファイルシステムが存在するコンピュータでは、機械語で書かれたプログラムは、実行ファイル(実行可能なバイナリファイル)として存在することが多い。実用化され、普及しているコンピュータのほとんどは、機械語及びファイルを2進数データの組合せで論理的意味を持ち、機械語でかかれたプログラムファイルを2進数を4bitずつ16進数に変換して表示すると、かろうじて認識が出来る状態になる場合が多い。この状態でプログラムの内容が分かるような人は殆ど存在しない。しかし、コンピュータの黎明期からの技術者などの中には、特定のCPUについては、0と1の羅列を全て諳んじており、16進数の状態で内容を読み取ってしまえる者も居る。

現在は人が機械語を扱うことは、メインフレームや組み込みシステムでのダンプ解析のような特殊な状況以外ではまずなく、仮に機械語でのプログラムが必要な場合は、機械語とほぼ1対1に対応するニーモニックを用いたアセンブリ言語を使うのが一般的である。

また、機械語を解読する場合には、オブジェクトファイルを読み込んで、対応するニーモニックとラベルを出力する逆アセンブラが利用される。

なお、アセンブリ言語を機械語に変換するアセンブラーが作られていないか、あっても高価だった時代には、機械語の表を片手にダンプリストを眺めながら、プログラムを開発・保守することが一般的であった。この様な行為を、ハンドアセンブルという。

機械語の構成

原則として、CPUの種類によって機械語に互換性はないが、多くのCPUにおいて機械語の構成は以下のような形式を取る。

  • 命令部(オペレーションコード、あるいはオペコード
CPUに処理をさせるための命令の番号を記録している。機械語に互換性がないのは、主にこの番号が一致しないことに由来する。
  • アドレス部(オペランド
情報として利用するデータが格納されているメモリアドレス、あるいはジャンプ命令でのジャンプ先、演算結果を記録すべき場所、場合によってはデータそのものを記録している。CPUや命令によって長さが異なる場合がある。オペランドの数に合わせて、0アドレス方式、1アドレス方式、2アドレス方式、3アドレス方式がある。0アドレス方式はオペレーションコードだけで、オペランドは存在しない。
  • データ部
プログラム内部で利用するデータが記録されている部分。命令にオペランドがあるとここまでジャンプしてデータを取得/記録していく。通常はプログラムの下端に存在する。

機械語の仕様の差異

上記類似点の範囲でのCPUごとの機械語の仕様の差異には、以下のようなものが挙げられる。

  • CPUが理解できる命令の種類や数が異なる(CISC、RISC、VLIW)
  • 命令の長さが異なる(CISCとRISCとでは長さが異なることがある。また、同じアーキテクチャでも、命令のビット数の違いも影響する)
  • 命令部の命令番号が一致しない
  • 同じ処理を行う命令でも処理結果が異なる
  • 演算方法が異なる(レジスタ - レジスタ間演算やメモリ - レジスタ間演算の違い。RISCでは後者の演算ができない)
  • データの記録方法が異なる(エンディアンやアラインメントの相違)
  • 実行形式のバイナリファイルの記録形式が異なる(PE、COFF、ELFなど)

コード例

情報処理技術者試験による仮想コンピュータ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!'


inserted by FC2 system