• 検索結果がありません。

41

C DC 6

MSG DC ’MESSAGE1’

END

このプログラムは、左が5で右が4、左が5で右も5、左が5で右が6、というそれぞれのオ ペランドでCPL命令を実行します。このプログラムの中でCPL命令がサインフラグとゼロフラグ に設定するものは、次の表のとおりです。

SF ZF 左が5で右が4 0 0 左が5で右も5 0 1 左が5で右が6 1 0

このプログラムの中で比較の対象となっているすべての整数は、最上位ビットが0です。この ように、最上位ビットが0の整数どうしを比較する場合、CPA命令とCPL命令は、同じ動作をす ることになります。

5.3.3 最上位ビットが1の整数を対象とする論理比較

最上位ビットが1の整数を、CPA命令がマイナスの整数とみなして比較するのに対して、CPL 命令は、それをプラスの整数とみなして比較します。

それでは、実際のプログラムで確かめてみましょう。

プログラムの例 cpl2.cas CPL2 START

LAD GR1,#FFFB CPL GR1,A DREG MSG CPL GR1,B DREG MSG RET

A DC #FFFA

B DC #0005

MSG DC ’MESSAGE1’

END

このプログラムは、まず、左が#FFFBで右が#FFFAというオペランドでCPL命令を実行しま す。左から右を減算した結果はプラスですので、

FR:0(OF:0 SF:0 ZF:0)

というように、サインフラグには0、ゼロフラグにも0が設定されます。ちなみに、#FFFBは符 号付き整数とみなすと5、#FFFAは符号付き整数とみなすと6です。このように、最上位ビッ トが1の整数どうしを比較する場合も、最上位ビットが0の整数どうしを比較する場合と同様 に、CPAの結果とCPLの結果は同じになります。

次に、左が#FFFBで右が#0005というオペランドでCPL命令を実行します。左から右を減算し た結果はプラスですので、

FR:0(OF:0 SF:0 ZF:0)

というように、サインフラグには0、ゼロフラグにも0が設定されます。#FFFBは符号付き整数 とみなすと5ですから、CPLではなくてCPAだとすると、減算の結果はマイナスになります。

このように、比較の対象となる二つの整数の最上位ビットが、一方は1で他方は0の場合、CPL とCPAは異なる動作をします。

列を対象とするビット演算というのは、ビット列を構成しているそれぞれのビットに対してビッ ト演算を実行するという演算のことです。

CASL IIが持っている13種類の演算命令のうちの3種類は、ビット演算を実行する命令です。

このチュートリアルでは、それらの3種類の命令を、「ビット演算命令」と呼ぶことにします。

情報処理技術者試験センターが公開しているCASL IIの仕様書では、ビット演算命令は、「論 理演算命令」と呼ばれています。しかし、このチュートリアルでは、「演算の対象を符号なし整 数とみなす演算命令」という意味で「論理演算命令」という言葉を使っていますので、それと区 別するために、ビット演算を実行する命令のことは「ビット演算命令」と呼ぶことにしました。

6.1.2 ビット演算命令

CASL IIには、ビット演算命令として、次の3種類のものがあります。

AND AND 論理積命令 OR OR 論理和命令 XOR eXclusive OR 排他的論理和命令

ビット演算命令は、汎用レジスタの内容や主記憶装置の語の内容を、整数とみなすのではなく、

単なるビット列とみなして演算を実行します。ですから、他の演算命令とは違って、算術演算命 令と論理演算命令との組にはなっていません。

6.1.3 ビット演算命令のオペランド

ビット演算命令のオペランドの形式は、第4.1.4項で説明した、演算オペランド形式です。

6.1.4 ビット演算命令によるフラグレジスタの設定

ビット演算命令も、他の演算命令と同じように、演算の結果に応じてフラグレジスタを変化さ せます。フラグレジスタのそれぞれのフラグには、次のようなものが設定されます。

オーバーフローフラグ 常に0を設定する。

サインフラグ 演算の結果として得られたビット列の最上位ビットが1ならば1、0な らば0を設定する。

ゼロフラグ 演算の結果として得られたビット列のすべてのビットが0ならば1、そ うでなければ0を設定する。

6.2 AND 命令

6.2.1 AND命令の基礎

「論理積命令」と呼ばれるANDは、汎用レジスタの内容と主記憶装置の語の内容、または二つ の汎用レジスタの内容に対して、「論理積」と呼ばれるビット演算を実行して、その結果を汎用 レジスタに設定する命令です。

6.2.2 ビットを対象とする論理積

ビットを対象とする論理積というのは、与えられた二つのビットの両方が1のときだけ結果が 1になって、それ以外のときは結果が0になる、というビット演算のことです。

AとBという二つのビットが与えられたとき、AとBの論理積は、次の表のようになります。

A B 論理積

0 0 0

0 1 0

1 0 0

1 1 1

6.2.3 ビット列を対象とする論理積

ビット列を対象とする論理積というのは、与えられた二つのビット列を構成しているそれぞれ のビットに対して論理積を実行して、その結果を並べることによってできるビット列を求める、

という演算のことです。たとえば、

6.2. AND命令 43 0000 0000 1111 1111

というビット列と、

0000 1111 0000 1111

というビット列との論理積を求めると、

0000 0000 0000 1111 という結果が得られます。

プログラムの例 and.cas AND START

LAD GR1,#00FF AND GR1,HOGE DREG MSG RET

HOGE DC #0F0F MSG DC ’MESSAGE1’

END

このプログラムは、まず汎用レジスタのGR1に#00FFというビット列を設定して、次にGR1の 内容とHOGE番地の語の内容との論理積を求めて、そののちDREG命令でレジスタの内容を表示し ます。HOGE番地には#0F0Fというビット列が格納されていますので、論理積の結果は#000Fに なります。したがって、GR1の内容は、

GR1:000F

と表示されるはずです。

6.2.4 マスク

論理積命令は、ビット列の中の一部分だけを残して、それ以外の部分をすべて0にしたい、と いうときに便利な命令です。

ビット列の中の一部分だけを残して、それ以外の部分をすべて0にする、という処理は、「マ スク処理」(mask processing)と呼ばれます。

マスク処理をしたいときは、まず、ビット列の中の残したい部分が1になっていて、0にした い部分が0になっているビット列を作ります。そのような、残したい部分と0にしたい部分とを 1と0で塗り分けたビット列は、「マスク」(mask)と呼ばれます。

マスク処理は、処理の対象となるビット列とマスクとの論理積を求めることによって実行する ことができます。たとえば、

1010 0110 1010 0110

というビット列の下位8ビットだけを残して、上位8ビットをすべて0にした、

0000 0000 1010 0110

というビット列を求めたいならば、

0000 0000 1111 1111

というマスクを作って、このマスクと、下位8ビットだけを残したいビット列との論理積を求め ればいいわけです。

プログラムの例 mask.cas MASK START

LAD GR1,#A6A6 AND GR1,HOGE DREG MSG RET

HOGE DC #00FF MSG DC ’MESSAGE1’

END

このプログラムは、マスク処理を実行することによって、#A6A6というビット列の下位8ビッ トだけを残して、上位8ビットをすべて0にした、#00A6というビット列を求めています。

6.3 OR 命令

6.3.1 OR命令の基礎

「論理和命令」と呼ばれるORは、汎用レジスタの内容と主記憶装置の語の内容、または二つ の汎用レジスタの内容に対して、「論理和」と呼ばれるビット演算を実行して、その結果を汎用 レジスタに設定する命令です。

6.3.2 ビットを対象とする論理和

ビットを対象とする論理和というのは、与えられた二つのビットの両方またはどちらか一方が 1のときは結果が1になって、両方とも0のときだけ結果が0になる、というビット演算のこと です。

AとBという二つのビットが与えられたとき、AとBの論理和は、次の表のようになります。

A B 論理和

0 0 0

0 1 1

1 0 1

1 1 1

6.3.3 ビット列を対象とする論理和

ビット列を対象とする論理和というのは、与えられた二つのビット列を構成しているそれぞれ のビットに対して論理和を実行して、その結果を並べることによってできるビット列を求める、

という演算のことです。たとえば、

0000 0000 1111 1111 というビット列と、

0000 1111 0000 1111

というビット列との論理和を求めると、

0000 1111 1111 1111 という結果が得られます。

プログラムの例 or.cas

OR START

LAD GR1,#00FF OR GR1,HOGE DREG MSG RET

HOGE DC #0F0F MSG DC ’MESSAGE1’

END

このプログラムは、まず汎用レジスタのGR1に#00FFというビット列を設定して、次にGR1の 内容とHOGE番地の語の内容との論理和を求めて、そののちDREG命令でレジスタの内容を表示し ます。HOGE番地には#0F0Fというビット列が格納されていますので、論理和の結果は#0FFFに なります。したがって、GR1の内容は、

GR1:0FFF

と表示されるはずです。

6.3.4 ビットを立てる処理

ビットを強制的に1にすることを、ビットを「立てる」と言うことがあります。また、ビット が1であることを、ビットが「立っている」と表現することがあります。

論理和命令は、ビット列の中にあるいくつかの特定のビットを立てて、それら以外のビットは そのままの状態にしておきたい、というときに便利な命令です。

いくつかの特定のビットを立てたいときは、まず、立てたい位置のビットだけが1で、それ以 外のビットが0になっているビット列を作ります。そして、そのビット列と、ビットを立てたい ビット列との論理和を求めます。たとえば、