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

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

新規登録して質問してみよう
ただいま回答率
85.35%
アセンブリ言語

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CASL

CASLは、情報処理技術者試験のプログラミング能力試験のために独自に開発されたアセンブリ言語です。架空の演算装置であるCOMETに対応可能。2001年からはCASLIIが後継として利用されています。

Q&A

2回答

5606閲覧

CASL2で、A÷Bの割算を、シフト演算と使って求めたいのですが、A<Bの場合、余りはAとなるという処理の書き方がわからない。

shuh_fjk

総合スコア0

アセンブリ言語

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CASL

CASLは、情報処理技術者試験のプログラミング能力試験のために独自に開発されたアセンブリ言語です。架空の演算装置であるCOMETに対応可能。2001年からはCASLIIが後継として利用されています。

0グッド

0クリップ

投稿2021/07/05 10:54

編集2021/07/05 10:56

CASL2で、A÷Bの割算を、シフト演算と使って求めたいのですが、A<Bの場合、余りはAとなるという処理の書き方がわからないです。ソースコードは、以下まで完成しております。

また、GR0は商、GR1は余りの格納に使用しており、最終的な計算結果はQUOに商、REMに余りをST命令で格納しています。

CASL2

1PGM START 2 CALL INIT 3 LD GR1,A 4 LD GR2,B 5 CPA GR1,=0 6 JZE ANS 7 CPA GR2,=0 8 JZE ANS 9COM CPA GR1,GR2 10 JMI ANS 11 CALL DIV 12 JUMP COM 13ANS ST GR0,QUO 14 ST GR1,REM 15 RET 16A DC 9 17B DC 2 18QUO DS 1 19REM DS 1 20 END 21INIT START 22 LD GR0,=0 23 LD GR1,=0 24 LD GR2,=0 25 RET 26 END 27DIV START 28 SUBA GR1,GR2 29 ADDA GR0,=1 30 RET 31 END

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

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

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

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

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

rubato6809

2021/07/05 22:05

×シフト演算と使って求めたい 〇シフト演算を使って求めたい 「以下まで完成しております」とあるから、A>=Bならシフト命令を使って計算できるのかと思ったら、このコードにはシフト命令が使われていません(商は引き算を繰り返した回数です)。これはどういうことですか? (A<Bという条件抜きに)シフト命令を使った割り算ルーチンを新たに作ってほしいという質問でしょうか、それなら話が違うと思いました。
guest

回答2

0

筆算で 100 ÷ 7 = 14 ... 2 を計算してみました。

イメージ説明

除数7は2進数で 111(2) です(以下、「(2)」がついた数は2進数)。

  1. 除数7を被除数100(1100100(2))に見合う所まで左シフトしたのが 1110000(2) です。つまり4ビットシフト済みです。
  2. 1100100(2) - 1110000(2) は引けないので、商に 10000(2) は立たない。
  3. 1110000(2) を右シフトして 111000(2) にする。今度は 1100100(2) - 111000(2) = 101100(2) になり、商に 1000(2) が立つ。
  4. 111000(2) を右シフトして 11100(2) にする。101100(2) - 11100(2) = 10000(2) になり、商に 100(2) が立つ。
  5. 11100(2) を右シフトして 1110(2) にする。10000(2) - 1110(2) = 10(2) になり、商に 10(2) が立つ。
  6. 1110(2) を右シフトして 111(2) にする。10(2) - 111(2) は引けず、商に 1(2) は立たない。
  7. ここまできて余りは2と決まる。

・・・というコードが発掘されました。核心部分を抜粋したのが次のコードです。ご参考まで。

CASL2

1; 被除数から除数を引ける分だけ商のビットを立てる 2DIV4 CPA GR0,GR1 ; 引き算可能か ? 3 JMI DIV5 ; 引けないならスキップ 4 SUBA GR0,GR1 ; 被除数 -= 除数 5 ADDA GR3,GR2 ; 商 += ビット 6DIV5 SRL GR1,1 ; 除数を半分にする 7 SRL GR2,1 ; ビット位置も右に 8 CPA GR2,=0 ; ビットが0になるまで 9 JNZ DIV4 ; 繰り返す

抜粋なので補足説明を。

  • この抜粋部分は GR0 ÷ GR1 を GR3 に求めていますが、最終的に GR3 を GR0 にコピーして返すようにしました。
  • 当然ですが、ここに来た時点の GR1 は元の除数そのものではなく、4ビット左シフトされた値です。
  • 同時に GR2 には 010000(2) がセットされています。ここにくるまでに GR1, GR2 共に被除数 GR0 に見合った値にする処理をしました。

投稿2021/07/06 23:22

rubato6809

総合スコア1382

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

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

0

筆算で割り算する場合の手順を考えてみよう。
それと同じことをすればいいのです

って比較してその条件だったら打ち切るだけの話なんでは。

投稿2021/07/05 11:50

編集2021/07/05 11:54
y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問