(since 1998/11)(更新 2004/02/26)

TNO2:CASL入門[4]

情報系/IT系の広告を掲載しています。(広告一覧)
©Copyright 1998-2001,2003,2004 小野智章(小野情報設計)
無断転載を禁止します。
本ページは、「Rook」仕様に対応済みです。
CASL入門[目次]
CASL入門[索引]
CASL入門[3]
CASL入門[5]

(chapter4-page1)
4-1.主記憶装置とラベル

 さて、汎用レジスタにはデータを記憶出来ますが、 記憶出来るデータの数がGR0〜GR7の8個に限られています。 多数のデータを記憶するには 主記憶装置を使用します。
 主記憶装置には、データの他にオブジェクト・プログラムも記憶されます。 データやプログラムが記憶される主記憶装置上の位置は、 アドレスと呼ぶ数値で指定されます。 しかし、実際に数値として表すのは大変なため、 プログラム中では 通常ラベルと呼ばれる名前を付けて示します。

 これまでのプログラムは、 「LAD」命令で汎用レジスタに直接数値を入れて、利用していました。 この章では、主記憶装置に入れたデータを使ってみましょう。
SAMPLE  START
  LD  GR0,CONST
  LAD  GR1,1
  ADDA  GR0,GR1
  WRITE  0
  EXIT
CONST DC  2
  END
 「CONST DC 2」は、 「CONST」という名前のラベルが付いたアドレスがあって、 そのアドレスに記憶された内容は「2」であるという意味です。 「アドレスに記憶された内容」のことを、 「アドレスの内容」の様に言うこともあります。
 「LD GR0,CONST」は、 GR0に「CONST」という名前のラベルが付いたアドレスの内容を 読込むという意味です。 つまり、この「LD」命令の行は、 GR0に2を読込むという意味になります。 従って、実行結果は次の様になります。
GR0=3(0003)
プログラムは、PR[0009;SAMPLE+9]が指定したEXIT命令で終了しました。
(chapter4-page2)
 今度は、計算結果を主記憶装置に書込んでみましょう。 次のプログラムを実行してみて下さい。
SAMPLE  START
  LD  GR0,DIGIT
  WRITE  0
  LAD  GR1,0
  ST  GR1,DIGIT
  LD  GR0,DIGIT
  WRITE  0
  EXIT
DIGIT  DC  7
  END
 実行結果は次の様になります。
GR0=7(0007)
GR0=0(0000)
プログラムは、PR[0010;SAMPLE+16]が指定したEXIT命令で終了しました。
 「ST GR1,DIGIT」は、 DIGITというラベルの付いたアドレスに GR1の内容を書込むことを意味しています。 書込まれた値が、 次の命令でGR0に読み出されていることを確認してください。

 ここで見たアドレスを使った命令の、一般形を示しておきます。
  LD  汎用レジスタ,アドレス
  ST  汎用レジスタ,アドレス
ラベル  DC  定数

 さて、アドレスは、他の数値と同様16ビットで表されています。 (他のアセンブリ言語、CPUでは異なるので、注意してください。) 又、CASLIIでラベルに使える名前には次の条件があります。
英大文字か数字。
英大文字で始まる。
8文字以内。
汎用レジスタ名と同じになるラベルは、禁止。
 Rookの独自仕様では、文字数が長くても良い様に拡張されています。 又、英小文字も可に拡張されていますが、大文字とは区別していません。

 尚、CASLIIの「DC」命令の定数では、 16進数を表記する時は4桁で表すため、 上位に必要な桁数分の「0」を付け加えます。 (Rookでは、省略出来ます。)

(chapter4-page3)
4-2.レジスタと主記憶の演算

 この章では、主記憶装置に入れたデータを直接使って、 計算してみましょう。
 次のソース・プログラムを入力して、実行してみて下さい。
SAMPLE  START
  LAD  GR0,2
  ADDA  GR0,CONST
  WRITE  0
  EXIT
CONST DC  1
  END
 「ADDA GR0,CONST」は、 GR0に「CONST」という名前のラベルが付いたアドレスの内容を 加えるという意味です。 つまり、この「ADDA」命令の行の意味は、 GR0に1を加えるという意味になります。 従って、実行結果は次の様になります。
GR0=3(0003)
プログラムは、PR[0008;SAMPLE+8]が指定したEXIT命令で終了しました。
 「ADDA」によって、 レジスタと主記憶に記憶された内容との演算を行いました。 ただし、結果が入るのは汎用レジスタのみです。 この方法は、「SUBA」「OR」「AND」「XOR」等でも、可能です。

 アドレスを使った演算命令の、一般形を示しておきます。
 ADDA  汎用レジスタ,アドレス
 SUBA  汎用レジスタ,アドレス
 AND  汎用レジスタ,アドレス
 OR  汎用レジスタ,アドレス
 XOR  汎用レジスタ,アドレス
 これらの他に、未だ見ていない 「ADDL」「SUBL」「CPA」「CPL」と言う命令も、同様です。

(chapter4-page4)
4-3.文字データ

 コンピュータの中では、文字も数値で表されています。 この文字を表す数値を、「文字コード」と呼びます。
 一般的に、何か意味のある情報を数値に変えて表す時、 その数値を「コード」と呼び、 その数値への変換を「コード化」と呼びます。 以前「命令コード」と言う言葉が出てきましたが、 コンピュータの中ではプログラム自体も数値で表されているため、 プログラムのことも「コード」と呼ぶことがあります。

 CASLIIでは、 「DC」命令のデータ中に文字を「’」で囲んで表しておくと、 その文字の文字コードとして使用することが出来ます。 又、この様に文字コードとして格納される固定値の文字データを、 CASLIIでは「文字定数」と呼んでいます。
 残念ながら、「LAD」命令には、この表記法は使えません。 又、英字の大文字と小文字では文字コードが異なることに、 注意しなければいけません。 Rookの独自仕様では、 命令語やラベルでの大文字と小文字を区別していませんが、 混乱しない様にしましょう。
(CASLIIの文字コードは英数字1文字が16ビットで扱われますが、 「アスキー」という1文字8ビットの文字コードと同じ数値になっています。 パソコンで一般的に使用されている「シフトJIS」と呼ばれる文字コードでは、 漢字は16ビット、半角の英数字は8ビットで表されています。)
SAMPLE  START
  LD  GR0,CONSTB
  WRITE  0
  SUBA  GR0,CONSTA
  WRITE  0
  EXIT
CONSTA  DC  ’A’
CONSTB  DC  ’B’
  END
GR0=66(0042)
GR0=1(0001)
プログラムは、PR[000C;SAMPLE+12]が指定したEXIT命令で終了しました。
 文字「B」の 文字コードが66で、 文字「A」の文字コードが それより1小さいことが分かります。 この様に英字の文字コードは、文字の順番と対応しています。

 さて、「数字」も「文字」の一種ですから、 文字コードがあります。 (文字である「数字」と、 「文字コード」の数値を 区別しておきましょう。)
(chapter4-page5)
 次の様にプログラムを書き換えて、実行してみて下さい。
SAMPLE  START
  LD  GR0,CONST3
  WRITE  0
  SUBA  GR0,CONST0
  WRITE  0
  EXIT
CONST0  DC  ’0’
CONST3  DC  ’3’
  END
GR0=51(0033)
GR0=3(0003)
プログラムは、PR[000C;SAMPLE+12]が指定したEXIT命令で終了しました。
 数字「3」の文字コードは51(16進数で33)で、 数字「0」の文字コードはそれより3小さいことが分かります。

(chapter4-page6)
4-4.数字の文字コード

 英字と同様に、数字も「0」〜「9」の順に文字コードが並び、 数字「0」〜「9」の文字コードはそれぞれ48〜57になります。 このことを利用すると、文字である数字から対応する数値を得ることが出来ます。

 では、数字「7」を数値7に変換するプログラムを作って見ましょう。
SAMPLE  START
  LD  GR0,DIGIT
  WRITE  0
  □□□□   GR0,CONST
  WRITE  0
  EXIT
DIGIT  DC  ’7’
CONST  DC  □□□
  END
 このプログラムは、最初に元の数字「7」の文字コードを表示して、 次に数字と同じ表現になる数値7を表示します。 「□」の部分を どの様にすれば、次の様な正しい結果が得られるでしょう。
GR0=55(0037)
GR0=7(0007)
プログラムは、PR[000C;SAMPLE+12]が指定したEXIT命令で終了しました。
 プログラムを完成することが出来たら、 プログラム中の「7」の部分を 色々な数字に変えて正しく動作することを確かめて下さい。

 さて、正しいプログラムが出来ましたか? 本当は、次の様に答えが複数有ります。
(chapter4-page7)
[答え]
 1. □□□□ = SUBA  ,□□□ = ’0’
 2. □□□□ = AND  ,□□□ = #000F
 3. □□□□ = XOR  ,□□□ = #0030
 1.の答えは、’7’の文字コードから’0’の文字コードを引いています。
 2.の答えは、’7’の文字コードが16進数で 37になることを利用して、 その下位1桁(4ビット分)の7のみを 取り出しています。 この様にデータの一部のビットのみを取り出す(又は取り除く)ことを 「マスク」と呼びます。 コンピュータでは良く使われる操作ですから、覚えておいて下さい。
 3.の答えは、’7’の文字コードの 16進数37の内の 3の部分を消し去るために、 ’0’の文字コードの16進数30と 排他的論理和を取っています。
 これらの答えの内で、 「’0’」と「#0030」は同じ値なので取り換えても構わず、 又「48」としても良いです。 同様に「#000F」は「15」としても同じ意味になります。

(chapter4-page8)
4-5.アドレスとラベル

 主記憶装置中の記憶する位置を表す「アドレス」は、 プログラムを作成するときは、通常「ラベル」の形で表していました。 しかし、コンピュータの中では、「アドレス」も数値で表されています。 従って、このアドレスを、その他の一般的な数値と同様に、 計算や表示に使うことが出来ます。

 ラベルの付いたアドレスを表す数値を直接レジスタに入れるには、 「LAD」命令を使います。 次の様にプログラムを書き換えて、 各ラベルの実際のアドレスを調べてみましょう。
SAMPLE  START
  LAD  GR0,DIGIT
  WRITE  0
  LAD   GR0,CONST
  WRITE  0
  EXIT
DIGIT  DC  ’7’
CONST  DC  ’0’
  END
GR0=14(000E)
GR0=15(000F)
プログラムは、PR[000C;SAMPLE+12]が指定したEXIT命令で終了しました。
 「LAD GR0,DIGIT」で、 「DIGIT」のアドレスがGR0に入り、 その値が14であることが分かります。 「LD」命令ではアドレスの内容がレジスタに入リましたが、 動作が異なることに注意してください。 また、「LAD GR0,CONST」で、 「CONST」のアドレスがGR0に入り、 その値が15であることが分かります。 さらに、「PR[000C;〜EXIT命令」で、 「EXIT」命令のアドレスが16進数で000Cになり、 「DIGIT」のアドレスの2つ前に当ることも、分かります。
 尚、「DC」命令で記憶させておく定数としてラベルを記述することで、 あるアドレスを表す数値を別のアドレスに記憶させておくことも出来ます。

CASL入門[目次]
CASL入門[索引]
CASL入門[3]
CASL入門[5]
学習室
トップ・ページへ

質問・ご意見等、お待ちしております。
小野智章(小野情報設計) 
Mail to Mail連絡先
©Copyright 1998-2001,2003,2004 小野智章(小野情報設計)
無断転載を禁止します。