3 アセンブラ言語を機械語に変換

3.1 マシン語変換表

今まで、さんざん言ったようにコンピューターのプログラムは、全てビットパ ターンに変換される。データである整数や文字の変換の仕方は、すでに学習し た。後は、命令の変換の仕方だけである。

文字の変換の仕方が、表(教科書p.13 JIS X0201)になっていたように、命令も 表になっている。教科書のp.213の命令語の構成に書かれている。全ての命令 がこの表に書かれている。40個弱しかないのである。

ただ、表の見方が、文字のコード表よりちょっと難しい。整数や文字は、16ビッ トのビットパターンであったが、命令の場合は16ビットであったり、32ビット だったりする。少し厄介であるが、慣れればたいしたことない。

それでは、実際の表の見方を示す。まずは、表の中央より右側に機械語命令が 書かれている。その左側がマシン語を表し、右側がその動作を記述している。 今は、動作はどうでもよいので、アセンブラの命令と機械語の対応を考える。 たとえば、LD命令を例にとる。表の機械語命令LDを見ると、 2つあることに気が付く。それは、

LD r,adr,x
LD r1,r2
である。LDは分かるとして、それ以外(オペランド)が分からない。 詳しいことは、今後の学習に譲るとして、それを簡単にまとめると、次のよう になる。
  r 汎用レジスター GR0GR7
  r1 1つの命令で2つの汎用レジスターを使うときの一方 GR0GR7
  r2 もう一方の汎用レジスター GR0GR7
  adr アドレスを示す。 レベル名が書かれることが多い。
  x アドレスをシフトするインデックスレジスタ。 GR0GR7
これで表の見方がわかった。アセンブラのプログラムをマシン語に変換できる ようになった。

たとえば、ラベルAが(A007)$ _{16}$として、LD GR1,A,GR2 という命令は、

LD GR1,A,GR2 $ \Rightarrow$ (1012) $ _{\texttt{16}}$
    (A007) $ _{\texttt{16}}$

と変換される。また、LD GR1,GR2という命令は、
LD GR1,GR2 $ \Rightarrow$ (1412) $ _{\texttt{16}}$
と変換される。これで、命令が1語の場合と2語の場合があることが分かるであ ろう。表を見て分かるように、2語を使う命令場合、その2語目は必ず、アドレ スとなっている。

これで、全て終わるのはまだ早い。賢い者は、LD GR1,A という命令 の変換方法に疑問が湧くであろう。インデックスレジスターが無い場合である。 これは、

LD GR1,A $ \Rightarrow$ (1010) $ _{\texttt{16}}$
    (A007) $ _{\texttt{16}}$
と変換される。すなわち、命令を構成する2語の最初の1語の第0〜3ビットがゼ ロの場合、インデックスレジスターが無いと判断されるのである。もし、イン デックスレジスターにGR0が使えると、インデックスレジスターが無 い場合とGR0を使っている場合の区別ができなくなる。そのような理 由から、インデックスレジスターにGR0が使えないのである。ハード ウェアー(CPU)がそうなっているからである。

3.2 ハンドアセンブル

準備が整ったので、図[*]のプログラムを機械語に変換する。これ をビットパターンに変換したものが、教科書のp.17の図2.4に書かれている。 ただし、この表には間違いがあるので、注意が必要である。プログラムの最初 のPGM STARTはアセンブラ命令と言って、機械語に変換されない。こ れについては来週の授業で説明する。したがって、最初に機械語に変換される 命令は、LD GR1,Aとなる。その変換は、次のように行う。
  1. LDという命令から、16進数4桁の表示の最上位の桁は (1)$ _{16}$と分かる。すなわちビットパターンは、(0001)$ _2$である。
  2. 次の桁は、LDには、(0)$ _{16}$か(4)$ _{16}$である。ここで は、LD r,adr,xのパターンとなっているので、次の桁は (0)$ _{16}$と分かる。すなわちビットパターンは、(0000)$ _2$である。
  3. 次の桁は、汎用レジスターを示す。(1)$ _{16}$と分かる。ビットパター ンは、(0001)$ _2$である。
  4. 次の桁は、インデックスレジスターを示す。インデックスレジスター は無いので、(0)$ _{16}$である。ビットパターンは、(0000)$ _2$となる。
ここの命令は、LD r,adr,xのパターンであるので、命令語長は2語で ある。最初の1語は今示したとおり、(1010)$ _{16}$である。次の1語は、ラベ ル$ A$のアドレスである。これは、プログラムが格納されるアドレスに依存す る。ここでは、教科書(p.17の図2.4)に沿って、(A000)$ _{16}$からプログラム は格納されるとすると、$ A$のアドレスは(A007)$ _{16}$となる。これが第2 語 のビットパターンとなる。以上をまとめると、
  命令   2進数 16進数
  LD GR1,A   0001000000010000 1010
      1010000000000111 A007
となる。

このようにアセンブラー言語を人間が表を見ながら、マシン語に変換すること をハンドアセンブル(ほとんど死語か?)と言う。これは単純作業なので、通常 は、コンピューターの仕事である。ただし、コンピューターを学習する者にとっ ては、一度は経験しておきたいことである。


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年9月7日


no counter