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

TNO:CASL入門[5]

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

(chapter5-page1)
5-1.指標レジスタと文字列

 次のプログラムを実行してみて下さい。
SAMPLE  START
  LAD  GR1,DIGIT
  LD  GR0,0,GR1
  WRITE  
  EXIT
DIGIT  DC  ’75’
  END
GR0=55(0037)
プログラムは、PR[0008;SAMPLE+8]が指定したEXIT命令で終了しました。
 「DIGIT DC ’75’」は、 DIGITのアドレスとその次のアドレスに、 順に数字’’と’’の 文字コードが入ることを表しています。 この様に複数の文字を並べたものを、 一般に文字列と呼びます。 CASLIIでは、「DC」命令中で「’」で文字列を囲むことで、 連続して文字コードを入れることが出来ます。 CASLIIでは、文字コードとして格納される固定値のデータを、 1文字の場合だけでなくこの様な文字列の場合も、 「文字定数」と呼んでいます。
 「LD GR0,0,GR1」は、 GR1の内容と0との和をアドレスとして、 そのアドレスの内容をGR0に入れることを表しています。 GR1にはDIGITのアドレスが入っていますから、 要するにDIGITの内容(’’の文字コード)が GR0に入ります。

 さて、この部分を次の様に書き換えて実行してみましょう。
  LD  GR0,1,GR1
(chapter5-page2)
GR0=53(0035)
プログラムは、PR[0008;SAMPLE+8]が指定したEXIT命令で終了しました。
 「LD GR0,1,GR1」は、GR1の内容と1との和をアドレスとし て、そのアドレスの内容をGR0に入れることを表しています。 要するにDIGITの次のアドレスの内容 (’’の文字コード)が GR0に入ります。
 この様な形で表したアドレスを実効アドレスと呼びます。 又、そこで使われるレジスタを 指標レジスタと呼びます。 指標レジスタとして使用出来るレジスタは、GR1〜GR7の汎用レジスタです。 (汎用レジスタGR0は、指標レジスタとしては使えません。)

 尚、「実効アドレス」のことを、 CASLII以外では「有効アドレス」と呼ぶ場合もあります。 又、同じ音韻になる「実行アドレス」とは区別してください。

 次の図に実効アドレスの表し方を示します。
 1.数値 : 実効アドレス=数値
 2.数値,指標レジスタ : 実効アドレス=数値+指標レジスタの内容
  (数値には、「ラベル」も含む。)
  (指標レジスタは、GR1〜GR7。)
 この図で分かる様に、 今まで出てきた命令中のラベルは実効アドレスを表していました。 また、指標レジスタを使った「DIGIT,GR2」の様な形式も 実効アドレスになります。

(chapter5-page3)
5-2.即値

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

 これらの命令の内「LAD」命令以外は、 指定されたアドレスの内容を使用したり、そのアドレスにデータを入れたりします。 つまりそれらの命令では、 「実効アドレス」は主記憶装置上のアドレスを指し示しています。 この様に直接主記憶装置上のアドレスとして「実効アドレス」を使用する形式を、 「直接アドレス指定」と呼びます。
 一方、「LAD」命令では、指定された「実効アドレス」の値そのものが レジスタに入れられます。 この様に「実効アドレス」をそのまま使用して表したデータを、 「即値アドレス」と呼びます。 (厳密に言うと、即値アドレスも「直接アドレス指定」に含まれます。)

 この即値アドレスを使用することで、 ある指標レジスタの内容を別のレジスタに移したり、 指標レジスタにある値を加算してからレジスタに入れることが出来ます。
 実際に、次のプログラムで即値アドレスの使い方の例を見てみましょう。
(chapter5-page4)
SAMPLE  START
  LAD  GR0,#0001
  LAD  GR1,#0003
  WRITE  
  WRITE  
  LAD  GR0,0,GR1
  WRITE  
  LAD  GR1,1,GR1
  WRITE  
  EXIT
  END
 このプログラムを実行すると、次の様な結果が得られます。
GR0=1(0001)
GR1=3(0003)
GR0=3(0003)
GR1=4(0004)
プログラムは、PR[0018;SAMPLE+24]が指定したEXIT命令で終了しました。
 「LAD GR0,0,GR1」は、GR1の内容と0の和が実効アドレスですから、 GR1の内容をGR0に入れる命令になります。
 「LAD GR1,,GR1」は、 GR1の内容と1の和が実効アドレスですから、 GR1の内容を1増やす命令になります。
 この指標レジスタの値を一定値だけ増減させる方法は、 CASLIIで良く使われる手法ですから、覚えておいて下さい。 (CASLIIの本来仕様では、 この部分の定数に負数が使えることが明示されていませんが、 出来る模様です。)

(chapter5-page5)
5-3.レジスタ間演算

 前の例では、指標レジスタの内容を他のレジスタに移すのに、 「LAD」命令の即値を使っていました。 この場合、移す元のレジスタは、 指標レジスタであるGR1〜GR7に限定されています。 GR0の内容を他のレジスタに移すことは出来ないのでしょうか?

 1つの方法は、データを記録する場所を用意する方法です。 GR0の内容を一旦主記憶上に保存し、 そこから他のレジスタに移すことが出来ます。 次のプログラムで、その方法を見てみましょう。
SAMPLE  START
  LAD  GR0,#0001
  LAD  GR1,#0003
  WRITE  
  WRITE  
  ST  GR0,SAVEGR0
  LD  GR1,SAVEGR0
  WRITE  
  EXIT
SAVEGR0 DS  
  END
 このプログラムを実行すると、次の様な結果が得られます。
GR0=1(0001)
GR1=3(0003)
GR1=1(0001)
プログラムは、PR[0014;SAMPLE+20]が指定したEXIT命令で終了しました。

 旧CASLではこの様な方法しか、ありませんでした。 しかしCASLIIでは、即値を使わずに「LD」命令を使って、 汎用レジスタの内容を他のレジスタに移すことが出来ます。 次のプログラムで、その方法を見てみましょう。
SAMPLE  START
  LAD  GR0,#0001
  LAD  GR1,#0003
  LD  GR0,GR1
  WRITE  
  WRITE  
  LAD  GR0,1,GR1
  WRITE  
  LD  GR1,GR0
  WRITE  
  EXIT
  END
 このプログラムを実行すると、次の様な結果が得られます。
GR0=3(0003)
GR1=3(0003)
GR0=4(0004)
GR1=4(0004)
プログラムは、PR[0018;SAMPLE+24]が指定したEXIT命令で終了しました。

(chapter5-page6)
 最初の「LD」命令の「LD GR0,GR1」は、 GR1の内容をそのまま、 GR0に入れることを表しています。 オペランド中では、2つのレジスタを指定しているだけで、 アドレスや数値の指定が無いことに注意してください。 GR1には3が入っていますから、GR0にも3が入ります。
 後のオペランドで指定するレジスタは、指標レジスタでなくても構いません。 2番目の「LD」命令の 「LD GR1,GR0」は、 GR0の内容をそのまま、 GR1に入れることを表しています。 その時点ではGR0には4が入っていますから、GR1にも4が入ります。

 「LD」命令には、 「LD GR0,LABEL」と言う様な形式も可能でしたね。 どうやって、ここで見た「LD GR0,GR1」と言う様な形式と 区別しているのでしょう。
 実は、2つめのオペランドが汎用レジスタかどうかで、区別しています。 前にラベルの指定で汎用レジスタ名と同じ名前は使えないと、 記述していたのを憶えているでしょうか。 この制限が無いと、 この様な場合にラベルを指定しているのか、 汎用レジスタを指定しているのかが判らなくなるためだったのです。

 今まで見てきた命令の中には、 「LD」命令以外にも オペランドに汎用レジスタのみを指定する命令がありました。 それらも合せて、一般形を見ておきましょう。
 LD  汎用レジスタ,汎用レジスタ
 ADDA  汎用レジスタ,汎用レジスタ
 SUBA  汎用レジスタ,汎用レジスタ
 AND  汎用レジスタ,汎用レジスタ
 OR  汎用レジスタ,汎用レジスタ
 XOR  汎用レジスタ,汎用レジスタ
 これらの他に、未だ見ていない 「ADDL」「SUBL」「CPA」「CPL」と言う命令も、同様です。

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

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