アセンブリ言語で0.25倍
初投稿です。変なところがあると思いますがすみません。
16進数で4桁の値を入力して、入力した値を0.25倍にしたいです。
10進数なら例えば、20/5をするとします。
20-5=15
15-5=10
10-5=5
5-5=0
という感じで、商を10進数なら求めることができるので
16進数でも同じ処理をしてみました。
すると、64(100)/4(4)=15(21)と出てしまいました.
()内10進数
19(25)という数が出れば正解です。
割る数を変えてみたり、動きを追ってみたのですが、根本的に考えたかたが間違ってる気がします。
ご指摘よろしくお願いします。
プログラムはすべて2バイトずつ
0200: 0064 #X 0202: #Y 0204: 0004 0206: 0000 0208: 0000: 0064 0200 #[200]→ACC 0004: 00F4 0204 #ACC-[204] ACCと[204]の比較 0008: 0033 0010 #入力が0か負だと終了 000c: 000F #FIN 0010: 00BA 0001 #ADD IX 1 IX+1→IX 0014: 00A4 0204 #SUB ACC [204] ACC-[204]→ACC 0018: 00F1 #ACCとIXの比較 001c: 0032 0010 #割られる数が大きいと分岐 0020: 007C 0102 #IX→[102] 商の格納 0024: 000F
何のアセンブリ言語・命令セットか書いてください(Z80やCASL2等)
開始時のIXは0が保証されているのでしょうか?
また、0018のACCとIXの比較は、ACCと[204]が正しいのでは?
なんのアセンブリ言語かはわからないのです。すみません。
ただ、私は新しく貼った表を見て進めています。
開始時のIXは必ず0から始まります。
0018のACCとIXの比較は、ご指摘の通りACCと[206]ではなく、
ACCと[204]でした。
そこは特に引っかかることがなかったので、盲点でした。
ありがとうございます。
表を見る限り機械語の命令は1バイトに見えるのですが、プログラムは2バイトで書かれているように見えます。
これは正しいですか? (それ以前にこれを理解していますか?)
また、命令表はオペランドの幅が書かれておらずこれだけではプログラムを組めません。
機械語の命令・プログラムは1バイト・2バイトであっています。
幅のことなんですが、私が持っている資料には書いていませんでした。
ただ、資料に書かれている例のプログラムを見てみるとすべてのプログラムの命令幅は2バイトだったので、
ここに書かれている命令に限っては、2バイトであると考えてよさそうです。
なるほど。こちらでも確認しました。
KUECHIP3というCPUのようで、
8bitCPUのKUECHIP2を命令もレジスタも全部16bitにしてしまうというなかなか乱暴な拡張をして命令は16bitの半分が0という無駄な構成になっているようです。
まあ学習用ならそんなものか…。
さてそれでコードを見て問題点を探したのですが、YT0014さんが既に指摘していますね。
> 0018のACCとIXの比較は、ACCと[204]が正しいのでは?
私も同意見です。
「ご指摘の通りACCと[206]ではなく」というのはなぜ[206]が出てくるのか分からないのですが、指摘を理解していますか?
ACCと[204]の比較に直して実行するとどうなりますか?
ACCと[204]比較してみたところ、正常に動きました。
ありがとうございます。
本当にしょうもないミスなのに手間を取らせてしまいすみませんでした。
最初に、 YT0014さんに指摘されたときには、
0018とはまた違うところでのミスに気づいてしまい、そこを指摘されたものと思いこみ、修正し直した気になっていて、0018のミスに気が付きませんでした。
すみません。
解決したようで何よりです。
1つだけ指摘を。BZPの機械語:21と記載されていますが、KUECHIP3での検索で見つけた資料では、32と記載されているものがありました。
http://www.metsa.astem.or.jp/KUECHIP3F/document/KUECHIP3_Simulator_ver08.pdf
他の分岐命令が3*であることから、32のほうが正しそうなので、ご注意ください。
それは、気づきませんでした。修正しておきます。
ご指摘ありがとうございます。
回答2件
あなたの回答
tips
プレビュー