• ベストアンサー

z80について

マイコンz80を使って、17H+09Hを16進加算とDAAを用いて10進加算を 行うプログラムをつくったのですが、この場合、 16進加算 20H 10進加算 26 となるのはわかるのですが、同じプログラムで、 「ABH+FFH」をやると 16進加算 AAH 10進加算 10 「EFH-44H」 16進加算 ABH 10進加算 45 となるんですが、この理屈がどうもわかりません。教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.5

いまさらですが、 加算後の DAA は、 1. 加算結果の下位4ビットが 0AH 以上か、ハーフキャリーが立っていれば 06H を加算する。 2. さらに A0H 以上か、1 の結果でキャリーが立てば、60H を加算する。 ということだから、 ABH + FFH = AAH となり、そのあとに DAA を実行すれば、 下位4ビットが 0AH 以上だから、06H を加算して B0H となり、A0H 以上だから、さらに 60H を加算して 10H となる。 減算後の DAA は、加算の場合の 06H と 60H の加算が減算になるので、 EFH - 44H = ABH となり、そのあとに DAA を実行すれば、 06H を減算して A5H となり、さらに 60H を減算して 45H となる。 もはや BCD の計算にはなっていないので意味の無い値ですが。

その他の回答 (4)

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.4

16進加算は、単純に加算してオーバーフローしたビットが切り捨てられるだけです。 (8ビットのAレジスタを使用しているため) この時、キャリーフラグが立つはずです。 17H+09H=20H、ABH+FFH=1AAH=AAH、EFH-44H=ABH でいいですね。 10進加算の場合は、オペランドの各ニブル(4ビット)の値が 0~9(BCD)に なっていなければいけません。 各ニブルが10進数の1桁として演算します。 17H+09H=17+9=26=26H となりますが ABH+FFH や EFH-44Hは、BCDではないのでうまく演算できないのだったと思います。 (詳しいことは忘れました) 下記URLをご参考に。 http://www.cs.shinshu-u.ac.jp/Lecture/SE2/Z80/lecture7.html http://delegate.uec.ac.jp:8081/club/koken/~ubora/z80_9.html

回答No.3

本来DAAを用いての計算はBCD同士の計算を行った後、計算結果をBCDに戻すための命令で、ご質問の計算「ABH+FFH」や「EFH-44H」は間違った使用(元の数値BCDではない)をされているため、おかしな結果になっております。 詳細は忘れましたがDAAはアキュムレータ(Aレジスター)に対し、DAA補正フラッグ?をみてBCD補正のための補正を行っているはずで、まともな、入力値では正しく計算されるはずです。

回答No.2

よかったらプログラムリストを見せて貰えないでしょうか? 可能でしたらアセンブリリストもお願いします。 あと、フラグレジスタの内容も。。。。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

10進の計算が いまいち うまくいってないように見えますが・・・。 17H+9Hの場合 20H 10進ならば 23+9になるはずです。 17Hが 23ですから。 上記で 26になるということは 17Hでは なく 17として扱われていることになります。 それで A0H以上の値は 正しく処理されてないのでしょう。 ちなみに ABH+FFHは 1AAHと なり、桁あふれした分は 切り捨てられて AAHとなるのでしょう。 どういうプログラムかは わかりませんが、仕様をきちんと決めて作りましょうね。

関連するQ&A

専門家に質問してみよう