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

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

新規登録して質問してみよう
ただいま回答率
85.46%
CASL

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

Q&A

1回答

242閲覧

CASLⅡ 数値から文字、文字から数値への変換

mikan2700

総合スコア0

CASL

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

0グッド

0クリップ

投稿2024/01/17 06:49

実現したいこと

CASLⅡについての質問です。
3つのサブルーチンを用いて、以下のことを実現したいです。
サブルーチンINPUT: キーボードからの入力を受け付け、入力された文字列を数値に変換。入力された数値は-32768〜32767の範囲にあるとする。
サブルーチンMULT: 2数の積を求める。オーバーフローは無視。
サブルーチンOUTPUT: MULTで求めた積を数値から文字列に変換し、出力。

発生している問題・分からないこと

サブルーチンINPUTとMULTは作成できたのですが、OUTPUTの作り方がわからず困っています。
数値を文字へ変換するためには、数値を10で割って各桁をバラバラにした後、各桁ごとに文字に変換していけば良いことはわかるのですが、どうやってコードに起こせば良いかわかりません。
また、INPUTについてなのですが、現時点では正の整数しか扱えません。負の整数も扱えるようにするためにはどうすれば良いかコードを教えて欲しいです。

該当のソースコード

CASLⅡ

1MAIN START 2NEXT LAD GR1, IN1 ; 入力結果を入れてもらう番地 3 CALL INPUT 4 LD GR1, IN1 5 JZE FIN ; 最初の入力が0なら終了 6 LAD GR1, IN2 ; 入力結果を入れてもらう番地 7 CALL INPUT 8 LD GR1, IN1 9 LD GR2, IN2 10 LAD GR3, PROD 11 CALL MULT 12 LD GR1, PROD 13 CALL OUTPUT 14 JUMP NEXT 15FIN RET 16IN1 DS 1 ;かけられる数 17IN2 DS 1 ;かける数 18PROD DS 1 ;積の答え 19 END 20 21;文字列を数値に変換 22INPUT START 23 OUT OBUF, OLEN 24 IN IBUF, ILEN ;入力を受け付け 25 LD GR0, =0 ;使用するGRを全て初期化 26 LD GR4, =0 27 LD GR5, =0 28 LD GR6, =0 29 LD GR7, =0 30 LD GR7, ILEN 31 SUBA GR7, =1 32CONVERT LD GR0, IBUF, GR4 ;GR0にアドレスIBUF+GR4の番地の内容をGR0にコピー 33 AND GR0, =#000F ;文字列を数値に変換 34 ADDA GR5, GR0 35 CPA GR4, GR7 ;最後の桁に到達したら 36 JZE LAST 37 LD GR6, GR5 ;GR5の値をGR6にコピー 38 SLL GR5, 3 ;文字を2倍 39 SLL GR6, 1;文字を8倍 40 ADDA GR5, GR6 ;足して10倍 41 LAD GR4, 1, GR4 ;添え字が1増える 42 JUMP CONVERT 43LAST ST GR5, 0, GR1 ;GR5に格納された数値をIN1/2に格納 44 RET 45OBUF DC 'TYPE A NUMBER' 46OLEN DC 15 47IBUF DS 6 48ILEN DS 1 49 END 50 51MULT START 52 LD GR4, =0 ;初期化、答えを入れる 53LOOP ADDA GR4, GR1 ;掛けられる数をGR4にロード 54 SUBA GR2, =1 ;かける数を1引く 55 CPA GR2, =0 56 JZE END 57 JUMP LOOP 58END ST GR4, 0, GR3 ;積の答えをPRODにロード 59 RET 60 END 61

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Googleで「CASLⅡ 数値 文字 変換」と検索しましたが、めぼしい記事が見つかりませんでした。

補足

特になし

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

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

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

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

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

guest

回答1

0

ロジックがわからないと言うことですかね。Pythonでのサンプルを書いておきます。
普通は再帰呼び出しを使うと思いますが、アセンブラ化しやすそうな書き方で書くと、
ループで桁数分だけ回るのでしょうか。

Python

1def foo(x): 2 dec = [None]*6 # サイズ6の配列 3 n = 6 - 1 # 配列右端の添え字。アセンブラだとそこを指すポインターか 4 while x > 0: 5 dec[n] = chr(x % 10 + 48) # 「chr」は文字コードの数値を文字化する関数。アセンブラだと関数無しで良い 6 n = n - 1 7 x = x // 10 # 「//」 は整数除算(切り捨て)の演算子 8 9 # 10進文字化のループ終わり 10 # この時点で、dec = [None, None, "2", "0", "2", "4"] になっている 11 return dec[n+1:6] # 文字を入れた部分だけ返す 12 13print( foo(2024) )

コメントを入れたので、Pythonを知らなくても読めると思います。

負の整数も扱えるようにするためにはどうすれば良いかコードを教えて欲しいです。

これは簡単だと思うのですが。
先頭文字が-だったかどうかを覚えておいて、そうだったら最後に符号反転する。

出力時も、負かどうか判断して、負だったら先頭に"-"を入れて、値を符号反転して正にしたものを10進変換して続ける。

投稿2024/01/17 09:26

otn

総合スコア84798

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

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

mikan2700

2024/01/17 10:15

ご丁寧にありがとうございます。 ロジックが理解できました! コードを自分で少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問