好きなおでんの具材ドラフト会議しましょう

お世話になっております。
CASLでLDの考えた方が良く整理できておりません。
アドバイスをいただければと思います。

◎処理フローの概要に関して
 処理フロー概要は以下の通りです。
 (1)GR1に文字列"1","2","3"の先頭アドレスを格納する。
 (2)GR1から"1"をGR2に格納する。

◎不明点に関して(文中に疑問点あり)
 上記の(2)を実現するためには、下記ロジックが必要と
 なるようです。
 LD GR2,0,GR1
 
 ここで不明なのは、上記ロジックに"0"がなぜ、
 必要であるかです。
 LD GR2,GR0 でも良いのではないかと考えました。

 そこで、下記について教えていただけないでしょうか。
 ・なぜ、"0"が必要になるか。
 ・LD GR2,GR0では、GR2に"1"が格納されない理由について。

 以上、よろしくお願い致します。

A 回答 (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|
+―+

この回答への補足

質問対象となったプログラムです。
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

補足日時:2009/03/29 10:55
    • good
    • 0
この回答へのお礼

わかりやすいご回答、有難うございました。
質問文に記述ミスがあったことをお許し下さい。
誤: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
------------------------------------------------------------
最初からもっと具体的に質問すべきでした。すみません。

お礼日時:2009/03/29 10:25

  >これにより、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_han …

上記の仕様書が抽象的で難しく感じるのなら,カネを出すことを惜しまず,CASLIIの解説本を購入して勉強なさることをお勧めします。Amazonなどの書籍購入サイトや情報処理技術者試験の話題のサイトで,読者のレビューをいくらでも見つけることができるでしょう。
    • good
    • 0
この回答へのお礼

回答が遅くなってしまい、申し訳ありません。
教えていただいたおかげで動きがわかってきました。

現状は実際の問題に入っているのですが、
なかなかうまくいきません。
なんとか頑張ります。
有難うございました。

お礼日時:2009/04/10 13:08

  >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)は同じ値です。
    • good
    • 0
この回答へのお礼

何度もご回答、有難うございます。
おかげ様で、少しずつですが、
いろいろ見えてきた気がします。

もう一点、確認させて下さい。

>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を勉強する上でこの考えかたには注意すべきというものがあれば教えていただけないでしょうか。
申し訳ありませんが、よろしくお願いします。

お礼日時:2009/03/29 22:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報