- ベストアンサー
CASL LDの考え方とは?
- CASL LDは、処理フローの整理に役立つ方法です。
- LD命令の動作の理解と、GR0と0の違いがポイントです。
- 概要を把握し、疑問点を解消するために、アドバイスを求めています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
LD の機能は次の2つに大別できる。 (1) 汎用レジスタ←汎用レジスタ,というデータのコピー (2) 汎用レジスタ←番地の指す内容,というデータのコピー (1) LD GR2,GR0 これは「汎用レジスタGR0の中身を,汎用レジスタGR2にコピーする」 質問文においてGR0に何が格納されているかはまったく指定されていないので, >・LD GR2,GR0では、GR2に"1"が格納されない のは当然。 (2a) LD GR2,A (2b) LD GR2,0 前者は「ラベルAが指す番地の一語分の内容を,GR2にコピーする」 後者は「0番地の一語分の内容を,GR2にコピーする」 第3パラメタに汎用レジスタが現れる書式は,指標レジスタ(第2パラメタで示された番地からの変位)を表すので, (2c) LD GR2,TBL,GR1 (2d) LD GR2,0,GR1 前者は「ラベルTBLからGR1(の中身)だけ離れた番地の一語分の内容を,GR2にコピーする」,いわゆる高級言語における配列名と添字の関係になる。 後者は「0番地からGR1だけ離れた番地,すなわち0+GR1で示される番地,すなわちGR1(の中身)が指す番地の一語分の内容を,GR2にコピーする」 よって, >GR1に文字列"1","2","3"の先頭アドレスを格納する。 のであれば,上記の"1"をGR2に取り出す命令は「LD GR2,0,GR1」 +―+ |1|←GR1 +―+ |2| +―+ |3| +―+
その他の回答 (2)
- jjon-com
- ベストアンサー率61% (1599/2592)
>これにより、LD GR2,GR1でもよいのでは無いかと思ってしまいます。 すでにNo.1で回答しました。質問者が誤記したGR0という表記をGR1に置き換えて,以下,そのまま繰り返します。 >(1) LD GR2,GR1 >これは「汎用レジスタGR1の中身を,汎用レジスタGR2にコピーする」 > >(2d) LD GR2,0,GR1 >「0番地からGR1だけ離れた番地,すなわち0+GR1で示される番地, >すなわちGR1(の中身)が指す番地の一語分の内容を,GR2にコピーする」 GR1に格納されているのが1000なら, 前者を実行してGR2に格納されるのは1000という値そのもの, 後者を実行してGR2に格納されるのは「1000番地の指す内容」です。 >今回のようにCASLを勉強する上でこの考えかたには注意すべき >というものがあれば教えていただけないでしょうか。 CASLIIの研修講座があるとしたなら,今回のご質問はその講座が始まって3時間以内に登場するような基本的な内容だと思います。 情報処理技術者試験センターから公表されている「アセンブラ言語の仕様」をよく読んで,実効アドレスについて完璧に理解するか, http://www.jitec.jp/1_00topic/topic_20081027_hani_yougo.pdf 上記の仕様書が抽象的で難しく感じるのなら,カネを出すことを惜しまず,CASLIIの解説本を購入して勉強なさることをお勧めします。Amazonなどの書籍購入サイトや情報処理技術者試験の話題のサイトで,読者のレビューをいくらでも見つけることができるでしょう。
お礼
回答が遅くなってしまい、申し訳ありません。 教えていただいたおかげで動きがわかってきました。 現状は実際の問題に入っているのですが、 なかなかうまくいきません。 なんとか頑張ります。 有難うございました。
- jjon-com
- ベストアンサー率61% (1599/2592)
>LD GR2,0,GR1 ←《不明点》 以降のコードはいっさい見ていません。このご質問にお答えするためには不要ですから。 分かりづらければ,具体的な番地の値を仮定すればどうでしょう。例えば,10進数で1000番地から1004番地までの連続した5語にデータが格納されている,と。 +―+ |1|1000 :ラベル名DATA +―+ |2|1001 +―+ |3|1002 +―+ |4|1003 +―+ |0|1004 +―+ であるなら, > LAD GR1,DATA ←《GR1に先頭アドレス格納》 というロードアドレス命令でGR1に格納される値は 1000 です。 >そうすると、疑問が発生します。 >GR1に格納されていた先頭アドレスは、 >「0番地からGR1離れた番地」と同じなのでしょうか。 GR1に格納されている先頭アドレス(=1000)と, 0番地からGR1離れた番地(=0+1000=1000)は同じ値です。
お礼
何度もご回答、有難うございます。 おかげ様で、少しずつですが、 いろいろ見えてきた気がします。 もう一点、確認させて下さい。 >GR1に格納されている先頭アドレス(=1000)と, >0番地からGR1離れた番地(=0+1000=1000)は同じ値です。 これにより、LD GR2,GR1でもよいのでは無いかと思ってしまいます。 GR1に"1","2","3"の先頭アドレスを格納していたとき、 なぜ、LD GR2,GR1では"1"をGR2に格納できないのでしょうか。 "1"を格納するのであれば、LD GR2,0,GR1となんら変わりがないように思えます。 (シュミレータ等で実施しても自分が想定するような値はGR2に入ってきません) また、今回のようにCASLを勉強する上でこの考えかたには注意すべきというものがあれば教えていただけないでしょうか。 申し訳ありませんが、よろしくお願いします。
お礼
わかりやすいご回答、有難うございました。 質問文に記述ミスがあったことをお許し下さい。 誤: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