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

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

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

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

Q&A

解決済

1回答

2750閲覧

CASL2についてRET命令の後もとのルーチンに戻らずNOP命令が出されてしまう

yukikona

総合スコア12

CASL

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

0グッド

0クリップ

投稿2020/01/16 09:06

編集2020/01/16 09:09

前提・実現したいこと

課題内容としまして、座席予約プログラムを作れというもので、16席を小さい数字の席から順に一席予約あるいは二席予約で行えというものです
この16席というのは0から15の番号が振られており、二席かけになっていてペアは0−1、2−3、4−5...となっています。なので二席予約では3−4や1−2で予約をすることはできなくなっています。
この席を私はGR2で全工程共通で、予約されている席の位置には1、予約されていない席の位置には0という形で表現しました。左から順に0、1、2としております。つまり、#8000なら0番目の席のみ予約されている、#C000なら0、1番目の席が予約されているということです
また出力は予約された席の番号です

発生している問題・エラーメッセージ

はじめに1人予約してから2人予約しようと思い出てくる表示の順に0->1->0->2を入力しました しかし次の入力はできずエラーコードとして Illegal instruction DC at #fefc が表示され続きができない状態になっています 一つ一つ確認していったところどうやら最後の2を入力した後のRETでもとのルーチンであるREPORT4にRES2から戻らずNOPという命令が予期せず出されてしまいます 改善点を教えてください

ターミナルはこのようになっています
PR #0002 [ PUSH #0000, GR2 ]
SP #feff( -257) FR 001 ( 1)
GR0 #0000( 0) GR1 #0000( 0) GR2 #0000( 0) GR3 #0000( 0)
GR4 #0000( 0) GR5 #0000( 0) GR6 #0000( 0) GR7 #0000( 0)
comet> r
OUT> RESERVATION->0 CONFIRMATION->1
IN > 0
OUT> NUNBER OF PEOPLE?
IN > 1
OUT> 0
OUT> RESERVATION->0 CONFIRMATION->1
IN > 0
OUT> NUNBER OF PEOPLE?
IN > 2
OUT> 2
OUT> 3
Illegal instruction DC at #fefc.
joukiso $

該当のソースコード

CASL2

1REPORT4 START 2NEXT OUT BUFF, LEN ;予約状況をGR2に永久保存 3 IN BUFF1, LEN1 4 LD GR1, BUFF1 5 AND GR1, =#000F 6 CPL GR1, =0 7 JZE CALLRES 8 LD GR1, =0 9 CALL CONFIR 10 JUMP FIN 11CALLRES OUT BUFF2, LEN2 12 IN BUFF3, LEN3 13 LD GR1, BUFF3 14 AND GR1, =#000F 15 CPL GR1, =1 16 JZE CALRES1 17 LD GR1, =0 18 CALL RES2 19 JUMP FIN 20CALRES1 LD GR1, =0 21 CALL RES1 22FIN JUMP NEXT 23 RET 24BUFF DC 'RESERVATION->0 CONFIRMATION->1' 25LEN DC 30 26BUFF1 DS 256 27LEN1 DS 1 28BUFF2 DC 'NUNBER OF PEOPLE?' 29LEN2 DC 17 30BUFF3 DS 1 31LEN3 DS 1 32 33 34RES1 START 35 LD GR1, =0 ;GR1にループ数 GR3で計算 36 LD GR3, GR2 37 CPA GR2, =#FFFF 38 JZE NOK 39 XOR GR3, =#FFFF 40LOOP SLL GR3, 1 ;LOOPで空きの位置を把握 41 JOV EMPTY 42 ADDA GR1, =1 43 JUMP LOOP 44EMPTY LD GR4, =15 45 SUBA GR4, GR1 46 LD GR5, =1 47LOOP2 SLL GR5, 1 48 SUBA GR4, =1 49 CPA GR4, =0 50 JNZ LOOP2 51 OR GR2, GR5 52 OR GR1, =#0030 53 ST GR1, BUFF5 54 OUT BUFF5, LEN5 55 LD GR1, =0 56 LD GR3, =0 57 LD GR4, =0 58 LD GR5, =0 59 JUMP FIN1 60NOK OUT BUFF4, LEN4 61FIN1 RET 62BUFF4 DC 'MANSEKI' 63LEN4 DC 7 64BUFF5 DS 1 65LEN5 DC 1 66 67 68RES2 START 69 LD GR3, GR2 70 LD GR4, =0 ;ループ数はGR4 71 XOR GR3, =#FFFF 72 LD GR1, =#C000 73LOOP3 PUSH 0, GR3 74 AND GR3, GR1 75 CPL GR1, GR3 76 JZE EXIT 77 CPL GR4, =7 78 JZE NOK1 79 SRL GR1, 2 80 ADDA GR4, =1 81 POP GR3 82 JUMP LOOP3 83EXIT OR GR2, GR1 ;GR1はカウント変数 84 LD GR1, =1 85 SLL GR4, 1 86 PUSH 0, GR4 87 OR GR4, =#0030 88 ST GR4, BUFF7 89 POP GR4 90 ADDA GR4, =1 91 OR GR4, =#0030 92 ST GR4, BUFF8 93 OUT BUFF7, LEN7 94 OUT BUFF8,LEN8 95 LD GR1, =0 96 LD GR3, =0 97 LD GR4, =0 98 LD GR5, =0 99 JUMP FIN2 100NOK1 OUT BUFF6, LEN6 101FIN2 RET 102BUFF6 DC 'MANSEKI' 103LEN6 DC 7 104BUFF7 DS 256 105LEN7 DC 1 106BUFF8 DS 256 107LEN8 DC 1 108 109 110CONFIR START 111 LD GR1, =0 112 LD GR3, GR2 113 LD GR4, GR2 114LOOP4 SUBA GR3, =1 115 AND GR4, GR3 116 ADDA GR1, =1 117 CPL GR4, =0 118 LD GR3, GR4 119 JZE EXIT3 120 JUMP LOOP4 121EXIT3 OR GR1, =#0030 122 LD GR1, BUFF9 123 OUT BUFF9, LEN9 124BUFF9 DS 256 125LEN9 DC 1 126 END

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

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

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

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

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

guest

回答1

0

ベストアンサー

あんましコードは読んでませんが、
CONFIR関数の最後がDSに突入してしまってます。
ここで暴走しますねえ


ちなみに誤作動を起こしたRETはRES2ルーチンの中のものです。

とのことなんで見てみると、
ここでPUSHとPOPの対応が取れてません。
これらはスタックを使うので、PUSHしたあとPOPしないでRETすると、これまた暴走します。

修正しましょう

投稿2020/01/16 09:12

編集2020/01/16 09:26
y_waiwai

総合スコア87774

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

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

yukikona

2020/01/16 09:18

ありがとうございます!確かにそこも間違ってました しかし試しにBUFF9の上にRETを入れ実行したのですがやはりうまくいきません ちなみに誤作動を起こしたRETはRES2ルーチンの中のものです。 恐縮ですがよろしくお願いします
yukikona

2020/01/16 09:43

ありがとうございます!! うまくいきました この前の質問ももy_waiwaiさんに回答してもらってて感謝しかないです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問