プロが教える店舗&オフィスのセキュリティ対策術

マイコンz80を使って、17H+09Hを16進加算とDAAを用いて10進加算を
行うプログラムをつくったのですが、この場合、
16進加算 20H
10進加算 26

となるのはわかるのですが、同じプログラムで、
「ABH+FFH」をやると
16進加算 AAH
10進加算 10

「EFH-44H」
16進加算 ABH
10進加算 45
となるんですが、この理屈がどうもわかりません。教えてください。

A 回答 (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 の計算にはなっていないので意味の無い値ですが。
    • good
    • 0

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/le …
http://delegate.uec.ac.jp:8081/club/koken/~ubora …
    • good
    • 0

本来DAAを用いての計算はBCD同士の計算を行った後、計算結果をBCDに戻すための命令で、ご質問の計算「ABH+FFH」や「EFH-44H」は間違った使用(元の数値BCDではない)をされているため、おかしな結果になっております。


詳細は忘れましたがDAAはアキュムレータ(Aレジスター)に対し、DAA補正フラッグ?をみてBCD補正のための補正を行っているはずで、まともな、入力値では正しく計算されるはずです。
    • good
    • 0

よかったらプログラムリストを見せて貰えないでしょうか?


可能でしたらアセンブリリストもお願いします。
あと、フラグレジスタの内容も。。。。
    • good
    • 0

10進の計算が いまいち うまくいってないように見えますが・・・。



17H+9Hの場合
20H

10進ならば
23+9になるはずです。
17Hが 23ですから。
上記で 26になるということは 17Hでは なく 17として扱われていることになります。

それで A0H以上の値は 正しく処理されてないのでしょう。

ちなみに ABH+FFHは
1AAHと なり、桁あふれした分は 切り捨てられて AAHとなるのでしょう。

どういうプログラムかは わかりませんが、仕様をきちんと決めて作りましょうね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!