CASL(CASL2)でこんな問題があります。ぜひ教えてください。
・以下のプログラムを実行したときに,ANS0番地からANS6番地までの各番地に格納される値を16桁の2進数で答えよ。本プログラムのNUM番地からの7語には,それぞれ数値として格納されているものとする。
LAD GR1,O
LOOP CPA GR1,LEN
JZE FIN
LD GR2,NUM,GR1
LD GR0,CHAR,GR2
ST GR0,ANS0,GR1
LAD GR1,1,GR1
JUMP LOOP
FIN RET
NUM DC 1,3,5,6,4,2,0
LEN DC 7
CHAR DC'ABCDEFGHIJ'
ANS0 DS1
ANS1 DS1
ANS2 DS1
ANS3 DS1
ANS4 DS1
ANS5 DS1
ANS6 DS1
END
・以下のプログラムを実行したときに,ANS番地に格納される値を,4桁の16進数で答えよ。本プログラムはNUM番地からの3語には,222が文字列として格納されているものにする。
START
LAD GR0,0
LAD GR1,0
LOOP CPA GR1,CNT
JZE NEXT
LD GR2,NUM,GR1
AND GR2,COOOF
ADDA GR0,GR2
LAD GR1,1,GR1
JUMP LOOP
NEXT LD GR3,GR0
SLA GR3,7
ST GR3,WK1
SRA GR3,3
ST GR3,WK2
SRA GR3,1
ST GR3,WK3
SRA GR3,1
ST GR3,WK4
LD GR3,WK1
SUBA GR3,WK2
SUBA GR3,WK3
SUBA GR3,WK4
ST GR3,ANS
RET
NUM DC '222'
CNT DC 3
C000F DC #000F
WK1 DS 1
WK2 DS 1
WK3 DS 1
WK4 DS 1
ANS DS 1
END
・以下のプログラムを実行すると,ANS番地からの5語に,以下のような
ビットパターンが格納される。
ANS+0番地 1000000000000000
ANS+1番地 0000000010000000
ANS+2番地 0000000000001000
ANS+3番地 0000000000000010
ANS+4番地 0000000000000001
このとき,(1)~(6)の空欄に適切な命令コードやオペランドを入れて,
プログラムを完成させよ。
START
LAD GRO,1
LAD GR1,1
((1)) GR2,LEN
LOOP SUBA GR2,=1
((2)) FIN
ST ((3))
SLL ((4))
SLA GR1,1
JUMP LOOP
FIN RET
ANS ((5))5
LEN ((6))5
END
・20文字以内の文字列Sを入力し,Sの末尾にある文字※の個数だけ
文字#をSの先頭に追加し,かつSの末尾にある文字※を削除した文字列
Rを出力する。
入力する文字S
CASLII※※※※
出力する文字R
####CASLII
こんな質問で非常にもし分けないのですが…
自分なりに色々考えましたが,どうもうまく行きません。
ご指導よろしくお願いします。
わかる範囲で構いませんのでロジックと解説をお願いします。
お礼
わかりやすいご回答、有難うございました。 質問文に記述ミスがあったことをお許し下さい。 誤:LD GR2,GR0 正:LD GR2,GR1 もう少々、確認させて下さい。 いただいたアドバイスは、LD GR2,0,GR1は0番地からGR1はなれた番地の値をGR2に格納するロジックだと思います。 そうすると、疑問が発生します。 GR1に格納されていた先頭アドレスは、「0番地からGR1離れた番地」と同じなのでしょうか。 また、上記の通りである場合、どのような手順で先頭アドレスが「0番地からGR1離れた番地」とイコールになるのでしょうか。 なお、今回の質問対象となったプログラムは以下の通りです。 ------------------------------------------------------------ MAIN1 START LAD GR1,DATA ←GR1に先頭アドレス格納 CALL CONVRT RET DATA DC '1' DC '2' DC '3' DC '4' DC 0 END ; CONVRT START PUSH 0,GR1 PUSH 0,GR2 PUSH 0,GR3 PUSH 0,GR4 LD GR2,0,GR1 ←不明点 JZE ERROR LAD GR3,4 LAD GR0,0 LOOP CPL GR2,='0' JMI ERROR CPL GR2,='9' JPL ERROR AND GR2,MASK SLL GR0,1 LD GR4,GR0 SLL GR4,2 ADDA GR0,GR4 ADDA GR0,GR2 LAD GR1,1,GR1 LD GR2,0,GR1 JZE FIN SUBA GR3,=1 JNZ LOOP ERROR LAD GR0,-1 FIN POP GR4 POP GR3 POP GR2 POP GR1 RET MASK DC #000F END ------------------------------------------------------------ 最初からもっと具体的に質問すべきでした。すみません。
補足
質問対象となったプログラムです。 MAIN1 START LAD GR1,DATA ←《GR1に先頭アドレス格納》 CALL CONVRT RET DATA DC '1' DC '2' DC '3' DC '4' DC 0 END ; CONVRT START PUSH 0,GR1 PUSH 0,GR2 PUSH 0,GR3 PUSH 0,GR4 LD GR2,0,GR1 ←《不明点》 JZE ERROR LAD GR3,4 LAD GR0,0 LOOP CPL GR2,='0' JMI ERROR CPL GR2,='9' JPL ERROR AND GR2,MASK SLL GR0,1 LD GR4,GR0 SLL GR4,2 ADDA GR0,GR4 ADDA GR0,GR2 LAD GR1,1,GR1 LD GR2,0,GR1 JZE FIN SUBA GR3,=1 ERROR LAD GR0,-1 FIN POP GR4 POP GR3 POP GR2 POP GR1 RET MASK DC #000F END