• 締切済み

CASLIIの問題で困っています

文字の'123'を数値の123に変換するプログラムをCASLで作るという課題が出来ずに困っています。 下記の手順を説明されたのですが、特に(2)と(3)がわからず困っています。 (1)数字を数値に変換 (2)3回ループするロジックを作る (3)1,2,3という1つ1つの数値を計算して123に変換する CASLがわかる方よろしくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>実行は出来たのですが、GR3に入る値が1235になってしまいます。 >どこを直せばいいのでしょうか? 全部。 なんてシミュレータで実行したら 1235になったのでしょうか? InfoCASL Home Page http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/infocasl/index.html で試したら異常終了しましたよ。 まあシミュレータのバグという話もなくはありませんが、 少なくとも ・ループ回数の判定がない CPA   GR2,GR3 で、レジスタに入っている値は それぞれ何? ・レジスタの値を十倍する部分がおかしい GR1を十倍にしようとしている? ・問題では文字列の '123' を数値化するように書かれているのに DC で置かれているのは数値の1,2,3 もっとも、文字を数値にする('0'を引く)ことを していないのである意味つじつまは合ってますが。 あたりをもう一度考え直した方がよいかと。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

(1)は、文字コードから48(0の文字コード)を引き算すればいいですね。 (2)は、ループの前にGR0からGR7のどれかのレジスタに3を代入しておく。で、ループの最後でレジスタから1を引き算して、その結果が0以上であれば、ループの先頭に戻る。例えばこんな感じ    LAD GR0, 3 LOOP ループここから     …    ここまで    SUBL GR9, =1    JNZ LOOP (3)は、与えられた数の10倍を計算するルーチンが必要です。CASLIIに掛け算の命令はないので、8倍したものと2倍したものを足し算します。こんな感じ。GR0に入っている数字を10倍します。    SLL GR0, 1    LD GR1, GR0    SLL GR0, 2    ADDL GR0, GR1    

aobo-zu
質問者

お礼

ありがとうございます。 頑張ってみます。 学校でCASLIIシュミレータというソフトを使っているのですが、 こういったソフトは有料でしょうか?

aobo-zu
質問者

補足

無料のシュミレータを見つけることができ、作ってみたのですがやはりよくわかりません。 TEN  START  BGN TBL   DC   1,2,3 BGN   LAD   GR2,0     LAD   GR3,0 LOOP  LD   GR1,TBL,GR2      ADDA  GR1,GR3      SLL   GR1,1      LD   GR1,GR2      SLL   GR1,2      ADDA   GR1,GR2      LD   GR3,GR1      LAD   GR2,1,GR2     CPA   GR2,GR3      JPL   LOOP     ADDA   GR3,TBL,GR3      RET      END 実行は出来たのですが、GR3に入る値が1235になってしまいます。 どこを直せばいいのでしょうか?

関連するQ&A

  • CASLIIについて

    CASLIIについて質問します。 キーボードから数字を入力し、計算した結果を画面に出したいのですが、計算するために数値に変換する方法と画面に出力するために文字に変換する方法を教えてください。

  • CASLIIについて

    私が受けている授業では、パソコンについて教えてくれる授業をしていたのですが パソコンについては、ほとんど初心者の私たちを対象に、いきなりCASLIIのプログラムくばって、聞こえない声で、見えない字で説明しだしました。 そして、みんなぽかーんとわからない顔をしているのに、いきなり課題を出してきました。 1、文字列”S3@jp”のASCIIコードを16進数で書きなさい。   最後にはUNIXの改行コードLFの16進数を追加しなさい。 2、”情報”の区点コードを調べて、そのJISコード、EUCコードを書き  なさい。 3、以下で文字列はC言語と同様に数0で終わらせるものとします。文  字列の先頭アドレスがGR1に与えられたとき、文字列の長さをGR0に  入れて返す関数を書きなさい。 4、文字列の中のindex(位置)は0からはじめるとします。   GR1が先頭アドレスのとき文字列中の”@”を先頭から探して、   そのindexをGR0に入れて返す関数を書け。   ただし、”@”が存在しないときはー1を返すものとします。 5、前の3,4を文字列”S3@jp”に対して実行して、結果を画面に表  示するプログラムを書きなさい。 期限は明日まで(6月22日)と無理難題です。 友達に聞いても、誰もわからない状態で、何からしらべていいのやら。 正直泣きそうです。 そこで、考え方やアドバイスやヒントや・・・ 正直いうと答えを教えてもらいたいです。 どうか力をかしていただけないでしょうか。

  • CASLIIの問題が分かりません。

    資格の勉強のためCASLIIの参考書を買い問題を解いてるのですが分からないので質問します。 4桁の16進文字列を入力し、それを数値に変換してメモリ上に格納するプログラム。 SAMPL16 START LD GR1,0BUF LD GR0,=1000 CALL REVESUB OUT OBUF,LEN LET OBUF DS 4 LEN DC 1 ANS DS 1 END REVESUB START PUSH 0,GR1 PUSH 0,GR2 PUSH 0,GR3 PUSH 0,GR4 LAD GR0,0 LAD GR2,0 LOOP SLL GR0,4 ;ここまでの結果を4ビット左シフト LD GR3,0,GR1 ;1文字取り出し CPL GR3,='A' JMI NEXT ADDL GR3,=9 NEXT AND GR3,C000F ADDL GR0,GR3 LAD GR1,1,GR1 LAD GR2,1,GR2 CPL GR2,=4 JMI LOOP POP GR4 POP GR3 POP GR2 POP GR1 RET C000F DC #000F END SLL GR0,4 で4ビットシフトする意味がわかりません。あとLD GR3,0,GR1で1文字だけ取り出せるのですか?取り出すのは下位からですか?

  • CASLIIの数値データ入出力

    入出力のときはJISの文字コード表の値が使われ、それ以外の計算などにおいては通常の2進数が使われるとのことですが、その変換はどのように行うのでしょうか。 テキストには「1~9の文字には16進数の(0030)を減算」「A~Fの文字には(0037)を減算」と書いてあります。 例えば ’5’は内部コードでは(0035)、 16進数の数値では(0005) 数値と文字コードの差は16進数で(0030) というのは理解できます。 ただアルファベットになると理解できません。 例えば ’A’は内部コードで(0041) 16進数の数値では(000A) 数値と文字コードの差は16進数で(0037) なぜここで(0037)になるのでしょうか・・。 (0041)を(0037)で減算し、(000A)になるまでの過程を教えてください。

  • Excelで文字を数値に変換する方法について

    文字になっている数字を計算するために各データに1をかけて数値に変換していましたが、ふと、何故そのようになるのかなと疑問を持ちました。どなたかおわかりの方は教えていただければありがたいです。よろしくお願いします。

  • CASL1

    CASL1の問題でわからないものがありました。お手伝いいただけると助かります。問題に解説も載っていたので一緒に載せておきます。きっとそれほど難しくない問題なのでしょうが、CASLになれない為参考書を読んでもよく理解できません。。 10進入力と数字コード 入力 1~4個の10進数字の列。 出力 入力を正の10進数とみなしたときの2進表現。但し、有効数字のみを出力すること。 例:入力 2006[Enter] 出力 11111010110(メモリーの16ビット表現をそのまま出力した 0000011111010110は不可) 解説: (1)CASLの入出力はメモリー上の連続する領域(入出力バッファ)に文字データとして置かれた内容をINマクロ、OUT マクロでバッファの名前(先頭番地に付けたラベル)、バッファの長さを指定して行う。 (2)文字列を10進数として処理するためには、各文字が意味として0~9の数値をもつこと、各桁が10の冪乗の重みをもつことを理解する必要がある。前者では文字データから数値への変換(文字0~9に対するJIS の文字コードは連続しているので文字0に対するデータを引けば数値になる)し、後者では(それまでに処理した)上位桁の数値を10倍して次の新しい桁の数値を加えればよい。CASLには乗算の命令はないので2倍したもの(左1ビットシフト)と8倍(更に左2ビットシフト)したものとを加えればよい。 (3)数値を2進数字の列として求めるには1ビットずつ処理してシフトすればよい。例えば、1とAND を取ると最下位ビットが抽出される。

  • アセンブラ言語の数字を数値に変換するプログラム

    LD GR3,GR1 ;GR3にGR1の数字を入れる。 AND GR3,=#000F ;数字を数値に変換 というアセンブラのプログラムがあったのですが、なぜGR3と16進数#000Fの論理積をとることで数字を数値に変換できるのでしょうか。 それと、ここでいう数字、数値の違いとは、数字の1はコンピュータ上では 49という数値に変換される(アスキー文字)という認識でよろしいでしょうか。

  • スリザーリンクの問題をランダムに生成するプログラム

    題名のようなプログラムをC言語で書きたいと思います。 日本語としておかしいところがあったらすいません。 方針としては下図のような時計回りの矢印ブロックをつくり  → ↑ ↓  ← 矢印の元を-1、1矢印の先を1としてつながったところが足して0になってループと判定し、これをどんどんつなげていって最終的に大きなループを作ろうと考えています。 スリザーリンクの問題として入り組んだループが生成されるように、二度目選択したときにはループを削除して凹凸やへこんだループを実現して、そのあと点対称、線対称にヒントとなる数字を書き入れていきたいと思います。 まず選択したマスを格納する配列と、矢印の向き(-1,1の情報)を格納する配列、ヒントの数字を格納する配列を用意してランダムに矢印のブロックを生成するプログラムを書いたのですが、凹凸やへこんだループのためのループ削除で複数のループができるようになってしまいました。 これを回避する条件など問題は山積みですが。 他にもっと良い方法やこうしたほうがいいよといったロジックなどあればご教示お願いします。

  • CASL2

    CASL2でどうしても分からない問題があります。 SLL命令で1桁ずつOFに出していくのですが、 プログラムの組み方をしっかり把握できていない為、 どうにもならない状態です。 分かる方がいらっしゃいましたら、 ヒントを頂きたいと思います。 よろしくお願いします。 ・課題1 DATA領域に格納されている1語の数値を、 2進数として画面に表示する プログラムを作成しなさい。 DATA領域の語は#1234とする。

  • プログラム

    前回も質問したんですが、よく意味が伝わってなかったんでもう一度質問させていただきます。 数字(1~9)が規則的に並んでいるとします。 例1)1,5,3,7,4,2,6,9,8,1,5,3,7,4,2,6,9,8,1,5,3,7,4,2,6,9,8… 例1では「1,5,3,7,4,2,6,9,8」が何回も続いて(ループして)います。 また、 例2)1,4,5,8,6,5,3,4,8,9,2,7,1,4,5,8,6,5,3,4,8,9,2,7,1,4,5,8,6,5,3,4,8,9,2,7… 例2では例1と違い連続する部分「1,4,5,8,6,5,3,4,8,9,2,7」に同じ数字が何回も使われています。ここでは4,5,8が2回使われています。 (例1では人間でも分かりやすいですが、例2では同じ数字が何度も繰り返されていると分かりづらいです。) ↑の例のようにたくさんの数値を入力して、どの部分が続いている(ループしている)のかをパソコンが見つけるというようなプログラムを作成、またはソフトがありますか? プログラムがあればソースコードを書いてもらえると嬉しいです。 回答をお願いします。