←練習問題へ :  INDEX :  次ページへ→



論理演算


  論理演算とは算術演算と異なり、真か偽か2つの状態から一定の規則に従って結果を得る計算方法である。2つの状態ということは、真と偽を2進数の1と0に置き換えて考えれば、2進数の1桁で表すことができる。一方、レジスタやメモリーの最小単位は 8bit(1byte)であるので、8bit(1byte)で、真か偽かの状態を8個記憶することができる。したがってこれから紹介する命令では最小単位が8bitであるから、8桁の2進数になおして計算することになる。

5-1.AND命令 ( Logical AND ) :論理積

AND命令は「論理積( Logical product )」を表す。論理積とは「両方とも1ならば結果は1、それ以外の場合の結果は0」である。(0×0=0, 0×1=0, 1×0=0, 1×1=1であるから各ビットの積と考えることもできる)

  これを表にすると下のようになる。(このような表を真理値表という)

DEST SRC 結果(DEST)
0 0 0
0 1 0
1 0 0
1 1 1

AND ( Logical AND ) :論理積

AND	DEST,SRC

   動作:DEST←DEST and SRC
  影響を受けるフラグ:OF=0,CF=0,ZF,SF,PF,AF
    DEST:レジスタ、メモリー
    SRC :レジスタ、メモリー、即値(ただしメモリー、メモリーの組み合わせは除く)
          


   フラグはCF,OFがクリアされる。AFは不定。結果が0になった場合ZF=1、それ以外はZF=0。上位1bitがSFに反映される。PFは結果に応じてセットされる。



用途
 
・0でのマスク
 
 
マスクとは、いらないビットを0または1で埋めることで、必要な部分を抜き出すことをいう。 0でのマスクとは、必要のない桁を0にすることをいう。例えば4bit目と5bit目以外を0でマスクしたい場合には、次のようにする。
	and	al,00011000b	


al=78h(=11110000b)の場合、

11110000
00011000

00010000

となり、4bit目と5bit目以外は0になり、4bit目と5bit目は元のデータのままになっていることがわかる。



・0かどうかのチェック

同じレジスタ同士の論理積をとると0かどうかのチェックをすることができる。例えば、AL=78h(=11110000b)のとき、

11110000
11110000

11110000

AL=0(=00000000b)の時は

00000000
00000000

00000000

したがってどちらの場合もレジスタの値は変わらない。しかし下の例ではゼロフラグがセットされる。したがって「CMP AL,0」と(レジスタの値とゼロフラグは)同じ結果が得られる。レジスタが8bit,32bitの時は「AND」命令で0かどうかのチェックをするメリットはないが、16bitレジスタの場合は命令のサイズが1バイト小さくなり、さらにCPUが80286以下の CPUでは若干処理速度も速くなる。ただし、なぜだかわからないが、0かどうかのチェックには 「OR」命令を用いるのが一般的である。



・正か負かのチェック

上の例と同様に正か負かのチェックをしたい場合は「AND」命令を用いることができ、同様のメリットが生まれる。

論理積 【86】
【書式】
 AND  dest,source
 dest   = reg/mem   source = reg/mem/imm
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
destsource の論理積をとり、結果をdest に格納し、結果に従ってフラグを設定します。
destdest AND source
【備考】
  • 対応するビットごとにANDをします。 この結果、対応するビットが共に1の場合のみ結果が1となり、他の場合は0となります。
【用例】
 
MOV  AL,'5'       ;
文字の5(バイナリで35H)を設定します。
AND  AL,00001111B ;
上位4ビットを0にし、2進数の5に変換します。

←練習問題へ :  INDEX :  次ページへ→