(since 1998/11)(更新 2004/04/25)

TNO:CASL入門[3]

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

(chapter3-page1)
3-1.算術演算

 これまでのプログラムは、汎用レジスタに数値を入れて、 そのまま出力していました。 この章では、コンピュータらしく、汎用レジスタに入れたデータを使って、 ちょっとした計算をさせてみることにしましょう。 次のソース・プログラムを入力して、実行してみて下さい。
SAMPLE  START
  LAD  GR0,
  LAD  GR1,
  ADDA  GR0,GR1
  WRITE  
  EXIT
  END
 「ADDA GR0,GR1」は、 GR0にGR1の内容を加えるという意味です。
 つまり上の「ADDA」命令の行の意味は、 GR0に1を加えるという意味になります。 従って、実行結果は次の様になります。
GR0=3(0003)
プログラムは、PR[0009;SAMPLE+9]が指定したEXIT命令で終了しました。
(chapter3-page2)
 別の計算もやってみましょう。 ソース・プログラムを次の様に修正して、実行してみて下さい。
SAMPLE  START
  LAD  GR0,
  LAD  GR1,
  SUBA  GR0,GR1
  WRITE  
  EXIT
  END
 「SUBA GR0,GR1」は、 GR0からGR1の内容を引くという意味です。
 つまり、GR0から1を引くという意味になります。 従って、実行結果は次の様になります。 (「SUBA」命令では、 どちらからどちらを引くか、特に注意して下さい。)
GR0=1(0001)
プログラムは、PR[0009;SAMPLE+9]が指定したEXIT命令で終了しました。
 残念ながら掛け算、割り算は、CASLIIには用意されていません。 これらの計算が必要な時は、 掛け算、割り算を行うプログラムを作ってやる必要があります。 (掛け算の例を、後ほど学習します。)

(chapter3-page3)
3-2.論理演算

 さて、CASLIIには、論理演算をする機能があります。 論理演算とは、次の様なものです。
 ここで、「正しい」を1で、「間違い」を0で表すと、次の式が成り立ちます。
 0 and 0=0 0 or 0=0 0 xor 0=0
 0 and 1=0 0 or 1=1 0 xor 1=1
 1 and 0=0 1 or 0=1 1 xor 0=1
 1 and 1=1 1 or 1=1 1 xor 1=0
 さっそく確かめてみましょう。 次のソース・プログラムを実行して下さい。
SAMPLE  START
  LAD  GR0,
  LAD  GR1,
  AND  GR0,GR1
  WRITE  
  EXIT
  END
 「」部分を 「」と、 「AND」命令の部分を 「OR」命令や 「XOR」命令と 換えて実行していけば、 上の12の式が成り立つことが分かりますね。

(chapter3-page4)
3-3.数値の表し方とビット

 ところで、汎用レジスタの「GR0」や「GR1」には、 「0」や「1」だけでなく、色々な数値が入りましたね。 「ADDA」や「SUBA」の時の様に、 色々な数値で論理演算をするとどうなるでしょう。 実際にやってみて下さい。
 「0」や「1」の場合と何となく似た結果になりませんか? この動作を理解するには、 コンピュータの中で数値がどの様に表されているかを、 知っておく必要があります。

 普段人間が使う数値は、 10進数と言って「0」〜「9」の10種類の数字で表しますが、 コンピュータの場合は、 2進数と言って「0」〜「1」の2種類の数字で表します。
 10進数 0,1,2,3,4,5,6,7,8,9
  2進数 0,1
  8進数 0,1,2,3,4,5,6,7
 16進数 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
 コンピュータの中のデータは、電気的な信号によって表されています。 この信号は、2つの状態になることが出来ます。 この「2つの状態のどちらであるか」によって、データを表します。 コンピュータの中の信号の2つの状態を 数値の「0」と「1」に対応させることで、数値を表すことが出来るわけです。

 数値を表すには10進数の場合でも1桁では足りませんから、 コンピュータの中でもこの様な信号をたくさん並べて、 2進数何桁分かで数値を表すことになります。 (2進数の1桁分のデータのことを ビットと呼ぶので、 「2進数1桁=1ビット」と 考えることもあります。)
 10進数 0,1,10,24,678.....
  2進数 0,1,10,11,101.....
 コンピュータの中の信号の個数は、勝手気ままに変えることは出来ません。 従って、数 値を表すための桁数も一定になります。 この数値を表すための桁数は、CASLIIでは16桁(16ビット)になっています。 (つまり、信号16個で数値を表す。) もちろん16桁未満の数値は、上の方の桁を「0」にして表します。

(chapter3-page5)
 この2進数は、書き表すのに桁数が多くなってしまいます。 そこで通常は次の様に、 2進数を3桁、または4桁ごとにまとめて、 8進数16進数にして書き表します。
CASLII 2進数 16桁
8進数 6桁
16進数 4桁
 この表は、2進数1000011000010101が、 8進数では103025、16進数では8615になることを、 表しています。
 8ビットで表される範囲の、 10進数、2進数、8進数、16進数の対応表が、 次のページにあります。 表示にはJavaScriptを有効にする必要がありますが、 参考にしてください。
==>
基数テーブル

 今まで、次の様に表示されていた、 括弧の中や「PR[」の後の16進数は、 コンピュータの中の数値を表すのに都合の良い表現方法だったわけです。
GR0=1(0001)
プログラムは、PR[0009;SAMPLE+9]が指定したEXIT命令で終了しました。
 尚、各レジスタ内容の一覧では、 括弧の前が16進数で、括弧の中が10進数になっています。 これは、「コンピュータの中の数値」を表示するものだからです。
 因みに、CASLIIのプログラム中で16進の数値を使うには、 その4桁の16進の数値の前に 「」を付けておけば良いです。

 それでは、16進数などと10進数の対応関係はどうなるのでしょうか?
 次の表の中の、括弧に囲まれた数はそれぞれの進数での表現、 そうでないものは10進数です。
 10進数 10 =10(進数)
100 =10×10
  2進数 (10)=2(進数)
(100)=(10)×(10)=2×2
  8進数 (10)=8(進数)
(100)=(10)×(10)=8×8
 16進数 (10)=16(進数)
(100)=(10)×(10)=16×16
(chapter3-page6)
 10進数 (123)=1×100+2×10+3×1
  2進数 (01010)=0×(10000)+1×(1000)
  +0×(100)+1×(10)+0×(1)
  =0×16+1×8+0×4+1×2+0×1
  8進数 (123)=1×(100)+2×(10)+3×(1)
  =1×64+2×8+3×1
 16進数 (123)=1×(100)+2×(10)+3×(1)
  =1×256+2×16+3×1
 10進数 1000=1×1000=(1000)
  2進数 1000=×512+488
  =(1000000000)+×256+232
  =(110000000)+×128+104
  =(111000000)+×64+40
  =(111100000)+×32+8
  =(111110000)+×8=(1111101000)
  8進数 1000=×512+488
  =(000)+×64+40
  =(100)+5×8=(1750)
 16進数 1000=×256+232
  =(00)+14×16+8
  =(30)+×1=(3E8)
    ∵(E)=14

(chapter3-page7)
3-4.論理演算とビットの関係

 さて、元の論理演算に話を戻しましょう。 論理演算には0と1のみを用いました。 これは2進数の1桁分と同じ(1ビット)です。 実際の数値はコンピュータの中で(CASLIIでは)、 16桁(16ビット)になります。 つまり論理演算のデータが、16個あるわけです。

 次の様にプログラムを書き換えて、実行してみて下さい。
SAMPLE  START
  LAD  GR0,
  LAD  GR1,
  AND  GR0,GR1
  WRITE  
  EXIT
  END
GR0=1(0001)
プログラムは、PR[0009;SAMPLE+9]が指定したEXIT命令で終了しました。
 結果は1ですね。
 3=
 5=
    … AND
 
 この様に、数値の論理演算は、 2進数で表した同じ桁同士の論理演算になります。
 では、色々な数値、論理演算の種類について、このことを確かめて下さい。
(chapter3-page8)
SAMPLE  START
  LAD  GR0,#004D
  LAD  GR1,#0040
  XOR  GR0,GR1
  WRITE  
  EXIT
  END
GR0=13(000D)
プログラムは、PR[0009;SAMPLE+9]が指定したEXIT命令で終了しました。
 上の例では、データを表すのに「#」を前に付けて16進数を使ってみました。 尚、CASLIIでは16進数は4桁で表すため、 最上位2桁分の「0」が必要です。 (本アセンブラでは省略出来ます。 又、厳密には、この16進定数の桁数の規定は 先で出てくる「DC」命令に対するものです。 ここに示した場合については、 本来の仕様ではこの規定は適用されない筈ですが、 「DC」命令の規定を援用しているCASLIIアセンブラも多い様です。)

 これまで、10進数や16進数などの数値を プログラム中に記述してきましたが、 この様な変化しない値を「定数」といいます。 CASLIIではこの他に、 文字などを定数のデータとして使うことも出来ます。 それらについては、もう少し先で学習します。

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

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