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

TNO:CASL入門[8]

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

(chapter8-page1)
8-1.2のべき乗とシフト

 先ほどのプログラムでは、2倍するのに次の様に、 「ADDA」命令によって加算していました。
  ADDA  GR1,GR1

 ところで2進数で考えると、2倍とはどの様な計算になるでしょうか?
2進数 (xxxx)×(10)=(xxxx0)
 10進数で10倍するのと同様ですね。 2進数16桁分で考えると、次の様になります。
  x)
 //// //// //// ////
0)
 この様に各桁の数(ビット)をずらせば良い訳です。 この中の一番上の桁は、ずらすと16桁(16ビット)に入り切らないので、 消えてしまいます。 この様に、2進数で桁をずらすことを、 シフトビット・シフト、 または桁シフト)と呼びます。
 同様に、4倍、8倍、、、とするには、 シフトする桁数(ビット数)を増やせば良く、 1/2、1/4、1/8、、、にするには、 反対向きにシフトしてやれば良い訳です。
(以下、2進数の1桁をビットと呼ぶことにします。)

 CASLIIにはこのシフトを行う命令が用意されています。
(chapter8-page2)
SAMPLE  START
  READ  
  SLL  GR1,1
  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  ;2−MOJIME
LEN  DC  
TO  DC  ’O_’
TA  DC  ’A_’
TB  DC  ’B_’
TAB  DC  ’AB’
  END
 「SLL GR1,1」は、レジスタGR1を 左方向に1ビット、シフトします。 この様な左方向のシフトのことを、 左シフトと呼びます。 シフトするビット数は最後の「,1」の部分で指定されています。 このシフトするビット数は、 以前出てきた実効アドレスによって、 即値として表します。 従って、指標レジスタでシフトするビット数を指定することも出来ます。

(chapter8-page3)
8-2.負の数と2の補数表現

 それでは、色々な形でシフト命令を使ってみましょう。
SAMPLE  START
  LAD  GR0,#000F ;15
  SLL  GR0,2 ;#F×4
  WRITE  
  LAD  GR1,1
  SLL  GR0,1,GR1 ;#F×4×4
  WRITE  
  LAD  GR0,#000F
  SLL  GR0,11 ;#F×2048
  WRITE  
  SLL  GR0,1 ;#F×4096
  WRITE  
  SLL  GR0,1  ;#F×8192
  WRITE  
  EXIT
  END
GR0=60(003C)
GR0=240(00F0)
GR0=30720(7800)
GR0=-4096(F000)
GR0=-8192(E000)
プログラムは、PR[0024;SAMPLE+36]が指定したEXIT命令で終了しました。
 最初の3行分の表示は問題無いですね。 16進の#F(10進の15)を、 それぞれ4倍、16倍、2048倍したものです。 括弧の中の16進も、2進数に直して、確認しておいて下さい。 当然、「SLL」命令では、最下位のビットに0が入ります。
(chapter8-page4)
 出力の後ろの2行分の10進数は負の数になっています。 3行目の「30720(7800)」の2倍と4倍のはずですから、 ちょっとおかしいですね。 括弧の中の16進を2進数に直して確認してみると、 正しく2倍と4倍されています。 どうしたことでしょう。

 実は、CASLIIの数値は、2進数16桁の最上位のビットが1になると、 負の数として扱う様になっているのです。 例えば「−1」は、次の様に表します。
  −1=(0)−(1)
  0000000000000000 = 0
  −) 0000000000000001 = 1

  1111111111111111 = −1
 「0」を17ビットで表しています。 コンピュータの中では16ビットしかありませんから、 最上位の「1」は仮想的な桁と考えて下さい。 引き算をしていて、その桁の数が足りない時に上の桁から1借りて来ます。 16桁の最上位の更に上の桁は無いので、 仮想的に借りてきたと見なして、計算すれば良いわけです。
 この様にして、2進数最上位のビットが1の時に負の数と見なす数値の表し方を、 2の補数表現と呼びます。 この方法で、16ビットで−32768〜+32767の範囲の整数を、 表すことが出来ます。 (この範囲の整数は、 「DC」命令のデータや実効アドレスの定数部分に、 書くことが出来ます。
 因みにRookでは、 「2の補数表現」チェック・ボックスのチェックを外すと、 それ以降の表示は負数にはならず、非負整数になります。

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

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