Subsections

4 命令の表現方法

コンピューターのプログラムは,命令とデータから構成されるのは,以前に述べたとおり である.CASL IIで扱うデータは整数と文字だけである.これらのデータをメモリーに格 納する方法は,既に学習が済んでいる.ここでは,命令がどのようにメモリーに格納され るか学習する.

4.1 プログラム例

一般的なことは言わないで,実際の例で命令がデータに格納される様子を示す.リスト 1に示したプログラムを用いて,メモリーに格納される様子を示す.その前 に,このプログラムの動作を示した方がよいだろう.これは だけである.FORTRANではC=3+5,C言語ではc=3+5;と書けばすむこと を,アセンブラではこのようにいろいろ書かなくてはならない.理由は,後で説明する.
   1 PGM	START
   2 	LD	GR1,A
   3 	ADDA	GR1,B
   4 	ST	GR1,C
   5 	RET
   6 A	DC	3
   7 B	DC	5
   8 C	DS	1
   9 	END

5がこのプログラムの動作をフローチャートである.また,プログ ラムの各行の動作と命令/データの区別を表2に示しておく.

表 2: リスト1の各行の動作内容と命令/データの区別
機能 種類  
1 PGM START プログラムは,STARTから開始    
2 LD GR1,A Aの値をレジスタGR1に格納 命令  
3 ADDA GR1,B GR1とBの値を加算して,GR1に格納 命令  
4 ST GR1,C GR1の値をCに格納 命令  
5 RET 呼び出し元へ戻る 命令  
6 A DC 3 値(3)$ _{10}$ を格納 データ  
7 B DC 5 値(3)$ _{10}$ を格納 データ  
8 C DS 1 1ワード予約 データ  
9 END プログラムの終わりを示す    


図 5: プログラムとフローチャート
\includegraphics[keepaspectratio, scale=1.0]{figure/program.eps}

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

リスト1のプログラムの大体の動作が分かったと思う.そこで,これをメモ リーに格納できるように,ビットパターン(16進整数)に変換しよう.この簡単なプログラ ムの命令の詳細は分からなくても良いが,命令もビットパターンに変換されることは理解 しなくてはならない.

2を見て分かるように,このプログラムは命令とデータからで きている.ここで,命令を16進数に直す方法が分かれば,プログラムの全てをビットパター ンに変換できる.このビットパターンこそ,コンピューターが唯一理解できるマシン語で ある.ここでは,人間の分かるアセンブラ言語からコンピューターが理解できるマシン語 に変換する方法を学ぶのである.

4.2.1 マシン語変換表

文字の変換の仕方が,表(教科書p.13 JIS X0201)になっていたように,命令も表になって いる.教科書のp.213の命令語の構成に,全ての命令のビットパターンが書かれている. これから分かるように,CASL IIには命令の数は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 アドレスをシフトするインデックスレジスタ. GR1GR7
これで表の見方がわかった.アセンブラのプログラムをマシン語に変換できるようになっ た.

たとえば,ラベル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)がそうなっているからである.

4.2.2 ハンドアセンブル

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

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


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
2005-11-18


no counter