Subsections
コンピューターのプログラムは,命令とデータから構成されるのは,以前に述べたとおり
である.CASL IIで扱うデータは整数と文字だけである.これらのデータをメモリーに格
納する方法は,既に学習が済んでいる.ここでは,命令がどのようにメモリーに格納され
るか学習する.
一般的なことは言わないで,実際の例で命令がデータに格納される様子を示す.リスト
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)
を格納 |
データ |
|
7 |
B DC 5 |
値(3)
を格納 |
データ |
|
8 |
C DS 1 |
1ワード予約 |
データ |
|
9 |
END |
プログラムの終わりを示す |
|
|
リスト
1のプログラムの大体の動作が分かったと思う.そこで,これをメモ
リーに格納できるように,ビットパターン(16進整数)に変換しよう.この簡単なプログラ
ムの命令の詳細は分からなくても良いが,命令もビットパターンに変換されることは理解
しなくてはならない.
表2を見て分かるように,このプログラムは命令とデータからで
きている.ここで,命令を16進数に直す方法が分かれば,プログラムの全てをビットパター
ンに変換できる.このビットパターンこそ,コンピューターが唯一理解できるマシン語で
ある.ここでは,人間の分かるアセンブラ言語からコンピューターが理解できるマシン語
に変換する方法を学ぶのである.
文字の変換の仕方が,表(教科書p.13 JIS X0201)になっていたように,命令も表になって
いる.教科書のp.213の命令語の構成に,全ての命令のビットパターンが書かれている.
これから分かるように,CASL IIには命令の数は40個程度しかない.
ただ,表の見方が,文字のコード表よりちょっと難しい.整数や文字は,16ビットのビッ
トパターンであったが,命令の場合は16ビットであったり,32ビットだったりする.少し
厄介であるが,慣れればたいしたことない.
それでは,実際の表の見方を示す.まずは,表の中央より右側に機械語命令(アセンブラ
言語)が書かれている.その左側がマシン語を表し,右側がその意味(動作)を記述してい
る.今は,動作はどうでもよいので,アセンブラの命令と機械語の対応を考える.たとえ
ば,LD命令を例にとる.表の機械語命令LDを見ると,2つあることに
気が付く.それは,
である.
LDは分かるとして,それ以外(オペランド)が分からない.詳しいこと
は,今後の学習に譲るとして,それを簡単にまとめると,次のようになる.
|
r |
汎用レジスター |
GR0〜GR7 |
|
r1 |
1つの命令で2つの汎用レジスターを使うときの一方 |
GR0〜GR7 |
|
r2 |
もう一方の汎用レジスター |
GR0〜GR7 |
|
adr |
アドレスを示す. |
レベル名が書かれることが多い. |
|
x |
アドレスをシフトするインデックスレジスタ. |
GR1〜GR7 |
これで表の見方がわかった.アセンブラのプログラムをマシン語に変換できるようになっ
た.
たとえば,ラベルAが(A007)
として,LD GR1,A,GR2
という命令は,
LD GR1,A,GR2 |
|
(1012)
|
|
|
(A007)
|
と変換される.また,
LD GR1,GR2という命令は,
LD GR1,GR2 |
|
(1412)
|
と変換される.これで,命令が1語の場合と2語の場合があることが分かるであろう.表を
見て分かるように,2語を使う命令場合,その2語目は必ず,アドレスとなっている.
これで,全て終わるのはまだ早い.賢い者は,LD GR1,A という命令の変換方法
に疑問が湧くであろう.インデックスレジスターが無い場合である.これは,
と変換される.すなわち,命令を構成する2語の最初の1語の第0〜3ビットがゼロの場合,
インデックスレジスターが無いと判断されるのである.もし,インデックスレジスターに
GR0が使えると,インデックスレジスターが無い場合と
GR0を使ってい
る場合の区別ができなくなる.そのような理由から,インデックスレジスターに
GR0が使えないのである.ハードウェアー(CPU)がそうなっているからである.
準備が整ったので,リスト
1のプログラムをマシン語(ビットパターン)に変
換する.これをビットパターンに変換したものが,教科書のp.17の図2.4に書かれている.
ただし,この表には間違いがあるので,注意が必要である.プログラムの最初の
PGM STARTはアセンブラ命令と言って,機械語に変換されない.これについては
来週の授業で説明する.したがって,最初に機械語に変換される命令は,
LD
GR1,Aとなる.その変換は,次のように行う.
- LDという命令から,16進数4桁の表示の最上位の桁は
(1)
と分かる.
- 次の桁は,LDには,(0)
か(4)
である.ここで
は,LD r,adr,xのパターンとなっているので,次の桁は
(0)
と分かる.
- 次の桁は,汎用レジスターを示す.ここで使われている汎用レジスターは,
GR1なので,(1)
となる.
- 次の桁は,インデックスレジスターを示す.インデックスレジスター
は無いので,その桁は(0)
となる.
ここの命令は,
LD r,adr,xのパターンであるので,命令語長は2語である.最初
の1語は今示したとおり,(1010)
である.次の1語は,ラベル
のアドレスである.
これは,プログラムが格納されるアドレスに依存する.ここでは,教科書(p.17の図2.4)
に沿って,(A000)
からプログラムは格納されるとすると,
のアドレスは
(A007)
となる.これが第2 語のビットパターンとなる.以上をまとめると,
|
命令 |
|
16進数 |
2進数 |
|
LD GR1,A |
|
1010 |
0001000000010000 |
|
|
|
A007 |
1010000000000111 |
となる.
このようにアセンブラー言語を人間が表を見ながら,マシン語に変換することをハンドア
センブル(ほとんど死語か?)と言う.これは単純作業なので,通常は,コンピューターの
仕事である.ただし,コンピューターを学習する者にとっては,一度は経験しておきたい
ことである.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
2005-11-18