質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
機械語

機械語とは、プロセッサが直接解釈・実行できる状態の言語です。

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

2回答

2805閲覧

アセンブリ言語で0.25倍

qedoroa

総合スコア1

機械語

機械語とは、プロセッサが直接解釈・実行できる状態の言語です。

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2020/07/14 15:15

編集2020/07/15 07:01

アセンブリ言語で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

イメージ説明
イメージ説明
イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maai

2020/07/14 16:17

何のアセンブリ言語・命令セットか書いてください(Z80やCASL2等)
YT0014

2020/07/14 16:57

開始時のIXは0が保証されているのでしょうか? また、0018のACCとIXの比較は、ACCと[204]が正しいのでは?
qedoroa

2020/07/14 17:15

なんのアセンブリ言語かはわからないのです。すみません。 ただ、私は新しく貼った表を見て進めています。 開始時のIXは必ず0から始まります。 0018のACCとIXの比較は、ご指摘の通りACCと[206]ではなく、 ACCと[204]でした。 そこは特に引っかかることがなかったので、盲点でした。 ありがとうございます。
ikadzuchi

2020/07/15 05:29

表を見る限り機械語の命令は1バイトに見えるのですが、プログラムは2バイトで書かれているように見えます。 これは正しいですか? (それ以前にこれを理解していますか?) また、命令表はオペランドの幅が書かれておらずこれだけではプログラムを組めません。
qedoroa

2020/07/15 06:57

機械語の命令・プログラムは1バイト・2バイトであっています。 幅のことなんですが、私が持っている資料には書いていませんでした。 ただ、資料に書かれている例のプログラムを見てみるとすべてのプログラムの命令幅は2バイトだったので、 ここに書かれている命令に限っては、2バイトであると考えてよさそうです。
ikadzuchi

2020/07/15 13:23

なるほど。こちらでも確認しました。 KUECHIP3というCPUのようで、 8bitCPUのKUECHIP2を命令もレジスタも全部16bitにしてしまうというなかなか乱暴な拡張をして命令は16bitの半分が0という無駄な構成になっているようです。 まあ学習用ならそんなものか…。 さてそれでコードを見て問題点を探したのですが、YT0014さんが既に指摘していますね。 > 0018のACCとIXの比較は、ACCと[204]が正しいのでは? 私も同意見です。 「ご指摘の通りACCと[206]ではなく」というのはなぜ[206]が出てくるのか分からないのですが、指摘を理解していますか? ACCと[204]の比較に直して実行するとどうなりますか?
qedoroa

2020/07/15 14:38 編集

ACCと[204]比較してみたところ、正常に動きました。 ありがとうございます。 本当にしょうもないミスなのに手間を取らせてしまいすみませんでした。 最初に、 YT0014さんに指摘されたときには、 0018とはまた違うところでのミスに気づいてしまい、そこを指摘されたものと思いこみ、修正し直した気になっていて、0018のミスに気が付きませんでした。 すみません。
YT0014

2020/07/15 14:55

解決したようで何よりです。 1つだけ指摘を。BZPの機械語:21と記載されていますが、KUECHIP3での検索で見つけた資料では、32と記載されているものがありました。 http://www.metsa.astem.or.jp/KUECHIP3F/document/KUECHIP3_Simulator_ver08.pdf 他の分岐命令が3*であることから、32のほうが正しそうなので、ご注意ください。
qedoroa

2020/07/15 16:10

それは、気づきませんでした。修正しておきます。 ご指摘ありがとうございます。
guest

回答2

0

0.25は2のべき乗なので、ビットシフトで出来ます。これは足し算より簡単に出来ます。

ビットシフトの詳細は調べてもらうとして、1左にシフトすると2倍、1右にシフトすると1/2になります(アセンブリ言語によっては逆かもしれません)。

C言語で書くと以下のようになります。これをアセンブリ言語で書けば良いです。

c

1int x = 0x0064; 2int res; // 結果 3 4int main() { 5 res = x; 6 res >>= 1; 7 res >>= 1; 8} 9

投稿2020/07/14 16:26

maai

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qedoroa

2020/07/14 18:20

シフト演算考えてみましたが、 ①値の入力 ②入力された16進数の値を疑似的に2進数に変換。 ここまではいいんですが、この先うまくいく気がしません。 例[100]=0000,[102]=0111,[104]=1000,[106]=1111 だとします。 この場合全体を右に2つシフトすると、[102][104]のような シフトすると1が右に行ってしまう場合があります。 このような場合はどうすればいいでしょうか。
maai

2020/07/14 21:57

「入力された16進数の値を疑似的に2進数に変換。」がよく分かりませんでした。 入力形式が16進数であろうと内部では2進数で保存されているはずなので、SRAかSLAをそのまま叩けば良いです。 ワード長を超える値に対して計算する場合は、ビットをワードを超えてシフトする必要があるので、追い出されたビットをフラグから救出します。 (ps:命令コード表を見てプログラムの入力が面倒くさい何かを思い出しました)
qedoroa

2020/07/15 03:48

フラグから回収すればいいんですか。 その発想はなかったです。頑張ってみます
guest

0

ベストアンサー

提示のコードをニーモニックに読み替えるのは面倒くさいんでやってませんが、
#はやいはなし、問題は読んでない

10進の整数演算でできることは16進でもそのまま実行可能です。
答えが間違ってるなら、それは計算が間違ってるってことです。

キカイゴで記述するんでなく、アセンブリコードで記述しましょう。
本当に問題を解決したいなら、あなたができることをやってください。

投稿2020/07/14 22:47

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qedoroa

2020/07/15 03:46

なるほど、10進数でできることは16進数でもできるんですね。 もう少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問