←前ページへ :  INDEX :  次ページへ→


3-7.除算 ( Division )

DIV ( Unsigned Divide ) :符号なし除算

DIV	SRC

   動作:符号なし整数の除算
          SRC = 1byte  :  AX ÷ SRC の余り→AH、商→AL
          SRC = 1word  :  DX:AX ÷ SRC の余り→DX、商→AX
          SRC = 1dword :  EDX:EAX ÷ SRC の余り→EDX、商→EAX
  影響を受けるフラグ : OF,SF,ZF,AF,CF,PF
    SRC :レジスタ、メモリー


IDIV ( Signed Divide ) :符号付き除算

IDIV	SRC

   動作:符号付き整数の除算
          SRC = 1byte  :  AX ÷ SRC の余り→AH、商→AL
          SRC = 1word  :  DX:AX ÷ SRC の余り→DX、商→AX
          SRC = 1dword :  EDX:EAX ÷ SRC の余り→EDX、商→EAX
  影響を受けるフラグ : OF,SF,ZF,AF,CF,PF
    SRC :レジスタ、メモリー

  除算には注意が2つ必要となる。電卓で「1÷0」と入力するとエラーになる。同様に0で割るとエラーになる。高級言語の場合は0で割るとエラーを表示してプログラムを終了するようにコンパイラが勝手にしてくれる場合もあるが、アセンブラの場合、通常はOSに処理が移ってしまいどうなるかわからない。

  2つめは大きい数を小さい数で割ってはいけない。割る数が1byteの場合、割られる数は1word(=2byte)の数である。そしてその商と余りは1byteである。したがって、 2000h÷2=1000h余り0であるが、商の1000hは1byteには収まりきらない。この場合もエラーが起こり、OSに処理が移ってしまい、その後どうなるかわからない。このようなエラーを「例外」と呼び、OSが用意している「例外処理」に処理が移行される。例外については後述する。

  • 0でわり算をしてはならない。
  • 商がレジスタに収まるように注意しなければならない

符号なし除算 【86】
【書式】
 DIV  source
 dest   = AH:AL/DX:AX/EDX:EAX    source = reg/mem
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
source のサイズに応じてdest (regH : regL)はAH:AL, DX:AX, EDX:EAXのいずれかになります。 destsource の2倍のサイズとなります。 destsource で割ったときの商をregLに、余りをregHに設定します。
regL regH : regL÷source の商
regH regH : regL÷source の余り
ただし商が大きすぎてregLに設定できない場合、またはsource が0の場合は割り込み(#DE)が発生します。
【備考】
  • 正しく商が設定された場合、余りは常にsource の値よりも小さくなります。

符号付き除算 【86】
【書式】
 IDIV  source
 dest   = AH:AL/DX:AX/EDX:EAX    source = reg/mem
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
source のサイズに応じてdest (regH : regL)はAH:AL, DX:AX, EDX:EAXの何れかになります。 destsource の2倍のサイズとなります。 destsource で割ったときの商をregLに余りをregHに設定します。
regL regH : regL÷source の商
regH regH : regL÷source の余り
ただし、商が大きすぎてregLに設定できない場合、またはsource が0の場合は割り込み(#DE)が発生します。
【備考】
  • 正しく商が設定された場合、余りの符号はdest と同じで、余りの絶対値は常にsource の絶対値よりも小さくなります。

←前ページへ :  INDEX :  次ページへ→