基本情報技術者過去問題 平成30年春期 午後問12
悪戦苦闘さん
(No.1)
どなたか教えてください。
問題文のプログラムで、次の3行がどうして右側のコメントのようになるのか分かりません。
~
LD GR4 , 0 , GR1 ;数字1文字の取出し
SUBL GR4 , ='0' ; 1桁を数値に変換
SLL GR0 , 1 ; GR0を10倍してGR4を加算
~
上の3行を次のように解釈してしまうのですが...
LD GR4 , 0 , GR1 ;GR1+0(数字列の先頭アドレス)の中身(数字1文字)をGR4にロード
SUBL GR4 , ='0' ; GR4-0(取出した数字1文字-0)の結果をGR4に格納??
SLL GR0 , 1 ; GR0(初期化してある)に1を足して、1ビット左に論理シフト??
問題文のプログラムで、次の3行がどうして右側のコメントのようになるのか分かりません。
~
LD GR4 , 0 , GR1 ;数字1文字の取出し
SUBL GR4 , ='0' ; 1桁を数値に変換
SLL GR0 , 1 ; GR0を10倍してGR4を加算
~
上の3行を次のように解釈してしまうのですが...
LD GR4 , 0 , GR1 ;GR1+0(数字列の先頭アドレス)の中身(数字1文字)をGR4にロード
SUBL GR4 , ='0' ; GR4-0(取出した数字1文字-0)の結果をGR4に格納??
SLL GR0 , 1 ; GR0(初期化してある)に1を足して、1ビット左に論理シフト??
2018.10.10 13:26
助け人さん
★FE ゴールドマイスター
(No.2)
コメント「GR0を10倍してGR4を加算」に対応する命令は、同じ行の
SLL GR0, 1
だけでなく、その行から始まって4行後の
ADDL GR0, GR4
までです。 ← 命令1行とコメント1行が対応しないとは、ズルイ。
数字列567の場合にどう動くかを説明します。
LD GR4, 0, GR1 ;数字1文字'5'をGR4にロード(GR4=#0035)
SUBL GR4, ='0' ;GR4-'0'=#0035-#0030=5('5'を5に変換)
SLL GR0, 1 ;GR0を1ビット左にシフト、つまりGR0は元GR0の2倍
LD GR5, GR0 ;そのGR0をGR5にロード、つまりGR5は元GR0の2倍
空欄a SLL GR5, 2 ;GR5を2ビット左にシフト、つまりGR5は元GR5の4倍、つまり元GR0の8倍
ADDL GR0, GR5 ;GR0にGR5を加算、つまりGR0は元GR0の2倍+8倍で10倍
SLL GR0, 1
だけでなく、その行から始まって4行後の
ADDL GR0, GR4
までです。 ← 命令1行とコメント1行が対応しないとは、ズルイ。
数字列567の場合にどう動くかを説明します。
LD GR4, 0, GR1 ;数字1文字'5'をGR4にロード(GR4=#0035)
SUBL GR4, ='0' ;GR4-'0'=#0035-#0030=5('5'を5に変換)
SLL GR0, 1 ;GR0を1ビット左にシフト、つまりGR0は元GR0の2倍
LD GR5, GR0 ;そのGR0をGR5にロード、つまりGR5は元GR0の2倍
空欄a SLL GR5, 2 ;GR5を2ビット左にシフト、つまりGR5は元GR5の4倍、つまり元GR0の8倍
ADDL GR0, GR5 ;GR0にGR5を加算、つまりGR0は元GR0の2倍+8倍で10倍
2018.10.10 19:10
悪戦苦闘さん
(No.3)
助け人さん、ありがとうございます。
4行が1つのコメントに集約してあるとは、初級者には少々キツイですね。
しかし、お陰様でその部分は、スッキリしました。
もう一つお願いがあるのですが、GR0は初期化してあって、それを左シフトしても0のままではないのでしょうか。初期化の捉え方が間違っているのでしょうか。
4行が1つのコメントに集約してあるとは、初級者には少々キツイですね。
しかし、お陰様でその部分は、スッキリしました。
もう一つお願いがあるのですが、GR0は初期化してあって、それを左シフトしても0のままではないのでしょうか。初期化の捉え方が間違っているのでしょうか。
2018.10.10 22:32
助け人さん
★FE ゴールドマイスター
(No.4)
先ほど、誤解が生じる表現がありました。正しくは、
コメント「GR0を10倍してGR4を加算」に対応する命令は、同じ行の
SLL GR0, 1
だけでなく、その行の次から始まって4行後の
ADDL GR0, GR4
までの5行分です。
「GR0を10倍してGR4を加算」はループします。
数字列567の場合、
ループ1回目…GR0=0から始まり、最初の数字5をGR4にロードし、GR0=0×10+5=5
ループ2回目…GR0=5から始まり、次の数字6をGR4にロードし、GR0=5×10+6=56
ループ3回目…GR0=56から始まり、次の数字7をGR4にロードし、GR0=56×10+7=567
これで終わりです。
コメント「GR0を10倍してGR4を加算」に対応する命令は、同じ行の
SLL GR0, 1
だけでなく、その行の次から始まって4行後の
ADDL GR0, GR4
までの5行分です。
「GR0を10倍してGR4を加算」はループします。
数字列567の場合、
ループ1回目…GR0=0から始まり、最初の数字5をGR4にロードし、GR0=0×10+5=5
ループ2回目…GR0=5から始まり、次の数字6をGR4にロードし、GR0=5×10+6=56
ループ3回目…GR0=56から始まり、次の数字7をGR4にロードし、GR0=56×10+7=567
これで終わりです。
2018.10.10 23:33
悪戦苦闘さん
(No.5)
助け人さん、ご丁寧にありがとうございます。
ここまで詳しく書いていただけると、初級者にはとてもありがたいです。
つくづく、まだ勉強が足りないのを痛感しています。
これからも頑張ります。
また、困ったことがありましたら、助けてくださいね。(^^;
よろしくお願いいたします。
ここまで詳しく書いていただけると、初級者にはとてもありがたいです。
つくづく、まだ勉強が足りないのを痛感しています。
これからも頑張ります。
また、困ったことがありましたら、助けてくださいね。(^^;
よろしくお願いいたします。
2018.10.11 08:14
悪戦苦闘さん
(No.6)
助け人さん、助けてください。
教えていただいたことをしっかり理解しようと、再度吟味していたのですが......
LAD GR0,0 で躓きました。
LAD命令は、アドレスをGR0にロードするのですよね。
つまり、GR0に入っているのはアドレス(番地)です。
一方、GR4は、数値化されたデータが入っています。
それで、どうしてADDL GR0,GR4が成り立つのでしょうか。
GR0の値の変化を教えていただけると助かります。
よろしくお願いいたします。
教えていただいたことをしっかり理解しようと、再度吟味していたのですが......
LAD GR0,0 で躓きました。
LAD命令は、アドレスをGR0にロードするのですよね。
つまり、GR0に入っているのはアドレス(番地)です。
一方、GR4は、数値化されたデータが入っています。
それで、どうしてADDL GR0,GR4が成り立つのでしょうか。
GR0の値の変化を教えていただけると助かります。
よろしくお願いいたします。
2018.10.12 21:49
助け人さん
★FE ゴールドマイスター
(No.7)
LAD GR0, 0
は、問題用紙巻末の「アセンブラ言語の仕様」にあるLAD命令の説明では、読み取れません。
LD命令とLAD命令を対比して説明します。
LD GR0, A … GR0にAの内容をロード
LD GR0, =5 … GR0に5をロード
LAD GR0, A … GR0にAの実効アドレスをロード
LAD GR0, 5 … GR0に5番地の実効アドレスをロード、つまりGR0に5をロード
結論として、LD GR0, =nとLAD GR0, nは等価です。
過去問を見ると、LAD GR0, nは少なく、LD GR0, =nの方が多いですね。でも、LAD GR0, nは知っておく必要があります。
は、問題用紙巻末の「アセンブラ言語の仕様」にあるLAD命令の説明では、読み取れません。
LD命令とLAD命令を対比して説明します。
LD GR0, A … GR0にAの内容をロード
LD GR0, =5 … GR0に5をロード
LAD GR0, A … GR0にAの実効アドレスをロード
LAD GR0, 5 … GR0に5番地の実効アドレスをロード、つまりGR0に5をロード
結論として、LD GR0, =nとLAD GR0, nは等価です。
過去問を見ると、LAD GR0, nは少なく、LD GR0, =nの方が多いですね。でも、LAD GR0, nは知っておく必要があります。
2018.10.12 22:53
悪戦苦闘さん
(No.8)
助け人さん、早々にありがとうございます。
しかし、奥が深いですね~。
というか、私の思慮が浅いんですね。~トホホ(^^;
しかし、奥が深いですね~。
というか、私の思慮が浅いんですね。~トホホ(^^;
2018.10.12 23:13
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告