アプリ版:「スタンプのみでお礼する」機能のリリースについて

アセンブリプログラム上で16ビット同士を加算したいと考えています。
ただ、非常に条件が限定されていて、

【簡単な構成について】
・レジスタは8ビットAレジスタ一つのみ
・8ビット演算器(ALU)は一つのみ
・条件コードはZフラグのみ(ただし、書き換わるのは命令7.、8.でのみ)

【使える命令】
1.Aレジスタに即値をロード
2.Aレジスタに指定アドレスのデータをロード
3.Aレジスタから指定アドレスにストア
4.無条件分岐
5.Aレジスタand即値=0ならば分岐
6.Aレジスタor即値=0ならば分岐
7.Aレジスタと即値のandをとって書き戻し
8.Aレジスタと即値のorをとって書き戻し
9.Aレジスタと即値を加算して書き戻し
a.Aレジスタと指定アドレスのEORをとって書き戻し
b.Aレジスタと指定アドレスのデータを加算して書き戻し
c.間接アドレスのデータをAレジスタにロード
d.Aレジスタの内容を間接アドレスにストア
e.Aレジスタから即値を減算して書き戻し
f.Aレジスタから指定アドレスデータを減算して書き戻し

普通に考えるならば、下位8ビット同士の加算、上位8ビット同士と下位8ビットのキャリーを加算すれば出来ます。
しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。
出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。

A 回答 (4件)

#1.です。


深く考えずに答えたら、全く間違ってました。
XLとYLを加算して繰り上がっても、必ずしもZLが0になるわけでは無いですね。
[別解]
作業用の変数が使えるのなら(Wとする)
0→ZH
XL→ZL
YL→W
L1:
ZLをインクリメント
ZLが0なら、1→ZH
Wをデクリメント
Wが0でないならL1に戻る
ZHにXHを加算する→ZH
YH→W
L2:
ZHをインクリメント
ZHが0なら、1→キャリー用の変数
Wをデクリメント
Wが0でないならL2に戻る
終了

大雑把ですが、こんなのでどうでしょう?
    • good
    • 0
この回答へのお礼

やはり、被加算数を1ずつ足していく方法になりますよね…。
結構考えたのですが、他に効率的な方法が何も思い浮かばなかったもので。
この方法でプログラムを組もうと思います。
どうも有難うございました。

お礼日時:2008/01/29 21:18

大ヒント:


ある値に 2^4 = 16 を足したら桁上げがありました. 得られた結果はどのような範囲にあるでしょうか?
    • good
    • 0
この回答へのお礼

桁上げが発生する数値はEA~FFの範囲だと思いますが。
8ビット同士の加算でしたら、桁上げを含めて保存するとなると3バイト分領域が必要になるでしょうね。

お礼日時:2008/01/29 21:22

馬鹿な方法としては, 例えば 5+3 を


5+1+1+1
と考えればできます. 楽勝.
もっと賢くやるなら 2進数で考えましょう. つまり 5+3 を
5 + 2^0 + 2^1
のように考えるわけです. 「2^k を足して桁上げが発生した」状況をビットパターンで考えてみてください.
    • good
    • 0
この回答へのお礼

実は、それは私も考えたのですが、流石にFFFFを0001ずつ足していくととんでもない回数になると思い断念しました。
PCの処理ならそんなに時間がかからないかもしれないのですが。
ビットパターンの方は、ぱっと見ではちょっと分からなかったです。
少し考えてみようと思います。
どうもありがとうございました。

お礼日時:2008/01/29 21:08

全く問題なし。

楽勝です。
繰り上がりを判断するには、キャリーだけでなくZフラグでも判断できます。
加算した結果が0なら繰り上がり有りと判ります。(ただし0+0は除く)
処理を分けると次のようになります。(処理の最適化はしていない)
・変数X,Y,Z。(8ビット単位で、XL,XH,YL,YH,ZL,ZH とする)
・下位8ビット加算(XL+YL→ZL)
・上位8ビット加算(XH+YH→ZH)※ただし下位から繰り上がり無し
・上位8ビット加算(XH+YH→ZH)※ただし下位から繰り上がり有り
もちろんそれぞれの加算時に0+0の判断が必要です。
(片方が0なら繰り上がりは発生しない。)
    • good
    • 0

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