Z80で除算するには?

Z80には除算命令が無いので、除算を行いたい場合は、他の命令の組み合わせで除算を行うことになります。

(1) シフトで実現する
2のN乗で割る場合、Nビット右シフトに置き換えるとシンプルに記述できます。
例えば、Aレジスタの値を、符号無し整数として 4で割りたい場合。
  SRL     A
  SRL     A
		

(2) シフトと減算の組み合わせで実現する
割る数が 2のN乗でない場合、「割られる数から割る数をいくつ引けるか?」で求めるわけですが、
乗算の時と同じように2進数の筆算にすることで演算量を減らします。
下記にサンプルを示します。D = A / B, E = A mod B を演算します。
ただし、B = 0 の場合は正しい結果を得られません。
  LD      C,A
  XOR     A
  LD      D,A
  LD      E,B
  LD      B,8
LOOP:
  SLA     C
  RLA
  SUB     E            ; 試しに引いてみる
  JP      NC,SKIP_ADD  ; 引けた場合は SKIP_ADD
  ADD     A,E          ; 引きすぎた分を足し戻す, 必ず Cyフラグ立つ。
SKIP_ADD:
  CCF                  ; 引けなかった場合 Cy=0, 引けた場合 Cy=1 にする→これが着目桁の商
  RL      D            ; 商を Dレジスタの下位へ。
  DJNZ    LOOP
  LD      E,A
		

2020年8月15日 更新
[戻る]