アセンブリプログラム上で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ビットのキャリーを加算すれば出来ます。
しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。
出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。
No.3ベストアンサー
- 回答日時:
#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に戻る
終了
大雑把ですが、こんなのでどうでしょう?
やはり、被加算数を1ずつ足していく方法になりますよね…。
結構考えたのですが、他に効率的な方法が何も思い浮かばなかったもので。
この方法でプログラムを組もうと思います。
どうも有難うございました。
No.4
- 回答日時:
大ヒント:
ある値に 2^4 = 16 を足したら桁上げがありました. 得られた結果はどのような範囲にあるでしょうか?
桁上げが発生する数値はEA~FFの範囲だと思いますが。
8ビット同士の加算でしたら、桁上げを含めて保存するとなると3バイト分領域が必要になるでしょうね。
No.2
- 回答日時:
馬鹿な方法としては, 例えば 5+3 を
5+1+1+1
と考えればできます. 楽勝.
もっと賢くやるなら 2進数で考えましょう. つまり 5+3 を
5 + 2^0 + 2^1
のように考えるわけです. 「2^k を足して桁上げが発生した」状況をビットパターンで考えてみてください.
実は、それは私も考えたのですが、流石にFFFFを0001ずつ足していくととんでもない回数になると思い断念しました。
PCの処理ならそんなに時間がかからないかもしれないのですが。
ビットパターンの方は、ぱっと見ではちょっと分からなかったです。
少し考えてみようと思います。
どうもありがとうございました。
No.1
- 回答日時:
全く問題なし。
楽勝です。繰り上がりを判断するには、キャリーだけでなく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なら繰り上がりは発生しない。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CPUの問題について 2 2022/07/09 12:04
- その他(コンピューター・テクノロジー) PIC16F1シリーズマイコンのNCO機能について 1 2023/04/18 08:41
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- その他(プログラミング・Web制作) パイプラインに詳しい方 5 2022/07/04 16:47
- その他(プログラミング・Web制作) プログラムについて。 2 2022/04/07 18:48
- IT・エンジニアリング アドレス空間(メモリマップ)について教えてください。 マイコンには必ずメモリマップが記載されています 3 2022/06/17 09:42
- 国産車 【自動車のエアコンはレジスタを介して回路が成立する】の、レジスタって何ですか? 2 2023/01/22 21:03
- 工学 レジスタとラッチの動作の違いについて教えてください 1 2022/11/30 23:13
- 国産車 スズキ キャリーのブロアーファンが止まるのはなぜ? 4 2022/07/17 17:45
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レジストってなんですか?
-
シーケンサのデータレジスタD...
-
レジスタの数
-
SRAMとレジスタの違いは何でし...
-
専用レジスタ 汎用レジスタ
-
キャッシュメモリとレジスタの...
-
PIC16F1シリーズマイコンのNCO...
-
CPUは何故、16bit→32bit→64bit...
-
PICでUSARTのフレーミングエラ...
-
CPUのビット数と、メモリ(主記...
-
64ビット、32ビットCPUについて
-
CASL LDの考え方
-
アキュムレータとインデックス...
-
CPUで行われている演算について
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ライン数とステップ数の違いは?
-
Windowsはオープンソースですか?
-
ものづくりに向いているプログ...
おすすめ情報