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

TNO:CASL入門[7]

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

(chapter7-page1)
7-1.数値の入力とアドレス計算

 「IN」命令と「OUT」命令で文字列の入力と出力が出来ました。 同様に、数値を出力する「WRITE」命令に対応して、 数値を入力する命令もあります。 数値を入力するには、 「READ」命令を使います。 但し、「READ」命令も「WRITE」命令も、 本来のCASLIIには無い、学習に便利な様にRookに追加された命令です。
 それでは、数値を入力して対応する血液型を表示するプログラムを作ってみましょう。
 まず、血液型に対応する数値を決めておきます。 この様な数値を、血液型コードと呼ぶことにします。 (一般に、何か意味のあるものを表す数値のことを、コードと言いましたね。)

   血液型    O  A B  AB
 血液型コード  0  1  2 
 この血液型コードを入力して、対応する血液型の文字列を表示させます。
SAMPLE  START
  READ  
  LD  GR0,T1,GR1 ;1−MOJIME
  ST  GR0,O1
  LD  GR0,T2,GR1 ;2−MOJIME
  ST  GR0,O2
  OUT  STRING,LEN
  EXIT
STRING  DC  ’TYPE=’
O1  DS  ;1−MOJIME
O2  DS  ;2−MOJIME
LEN  DC  
T1  DC  ’OABA’ ;1−MOJIME
T2  DC  ’   B’ ;2−MOJIME
  END
(chapter7-page2)
 次の出力例は、「」を入力した場合の実行例です。
Input : GR1 = 3(0003)
TYPE=AB
プログラムは、PR[0012;SAMPLE+18]が指定したEXIT命令で終了しました。
 プログラム中に何ケ所か出てくる「;」は、 その行の「;」より右がコメントであることを表しています。 このコメントはプログラムの実行には何の影響もありませんが、 プログラムを読み易くするために付け加えられます。
 「READ 1」は、キーボードから数値をGR1に入力します。 「READ」命令の記述形式は「WRITE」命令と同様です。
 アドレス「T1」とアドレス「T2」に それぞれ血液型コードを加算したアドレスからの1文字づつを、 出力用文字列に入れています。 その文字と血液型コードの関係は、次の様になります。
  血液型コード       0  1    2    3
「LD GR0,T1,GR1」
   の後のGR0の値    
’O’ ’A’ ’B’ ’A’
「LD GR0,T2,GR1」
   の後のGR0の値    
’ ’ ’ ’ ’ ’ ’B’
  表示される血液型の文字列  ’O ’’A ’’B ’’AB’

(chapter7-page3)
7-2.アドレス・テーブル

 このプログラムでは、 血液型を表す文字がプログラム上でバラバラになっていて、 どの様な表示になるのか分かりにくくなっています。 例えば、血液型ABを表す文字列が、 「’AB’」の形で出て来る方が分かり易いですね。
 それでは、表示される血液型の文字列が そのままプログラム中に出て来る様なプログラムを、作ってみましょう。
SAMPLE  START
  READ
  LD  GR1,ADRS,GR1
  LD  GR0,0,GR1 ;1−MOJIME
  ST  GR0,O1
  LD  GR0,1,GR1 ;2−MOJIME
  ST  GR0,O2
  OUT  STRING,LEN
  EXIT
STRING  DC  ’TYPE=’
O1  DS  ;1−MOJIME
O2  DS  ;2−MOJIME
LEN  DC  
ADRS  DC  □□□
  DC  □□□
  DC  □□□
  DC  □□□
TO  DC  ’O ’
TA  DC  ’A ’
TB  DC  ’B ’
TAB  DC  ’AB’
  END
(chapter7-page4)
 「」の部分をどうすれば、 次の様な正しい結果が得られるでしょう。
 この例は、「」を入力した場合の実行例です。
Input : GR1 = 2(0002)
TYPE=B
プログラムは、PR[0014;SAMPLE+20]が指定したEXIT命令で終了しました。
 さて、正しいプログラムが出来ましたか?答えは次の様になります。
[穴埋め部分]
ADRS  DC  □□□
  DC  □□□
  DC  □□□
  DC  □□□
[答え]
ADRS  DC  TO
  DC  TA
  DC  TB
  DC  TAB
 「LD GR1,ADRS,GR1」で血液型コードの「0〜3」に対応して、 アドレス「TO〜TAB」がGR1に入ります。 そのアドレスからの2文字分を、その後、アドレス「O1,O2」に入れています。
 アドレス「ADRS」からの4語にはアドレスが入っています。 この様なアドレスの 入った表のことをアドレス・テーブルといいます。 (コンピュータの世界では、表のことをテーブルと呼ぶことがあります。) アセンブリ言語では、 この様にアドレス・テーブルを使って アドレスをレジスタに読み込む事が良くあるので、 覚えておきましょう。

(chapter7-page5)
 次のプログラムの様に、アドレス・テーブルを使わない方法もあります。
SAMPLE  START
  READ  
  ADDA  GR1,GR1
  LD  GR0,TO,GR1 ;1−MOJIME
  ST  GR0,O1
  LAD  GR1,1,GR1
  LD  GR0,TO,GR1 ;2−MOJIME
  ST  GR0,O2
  OUT  STRING,LEN
  EXIT
STRING  DC  ’TYPE=’
O1  DS  ;1−MOJIME
O2  DS  1  ;2−MOJIME
LEN  DC  
TO  DC  ’O_’
TA  DC  ’A_’
TB  DC  ’B_’
TAB  DC  ’AB’
  END
 入力された血液型コードを2倍してアドレス「TO」を加算し、 そのアドレスからの2文字を出力する文字列に入れています。 血液型コードの2倍とアドレス「TO」の和は、 TO+0,TO+2,TO+4,TO+6となります。 これはTO,TA,TB,TABと同じになります。 「DC」命令のデータの格納場所は、出現した順に確保されているからです。 従って、求める結果が得られることが、分かりますね。
 この例では、2文字の出力でしたが、 3文字や4文字以上の場合にどの様にするかも、考えておいて下さい。

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

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