戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2013年 秋期 午後 問12


次のアセンブラプログラムの説明及びプログラムを読んで、設問1~3に答えよ。

〔プログラム1, 2の説明〕  図1のように、主プログラムから数字列として渡された100分未満の時間を数値の秒に変換する副プログラムTOSECと、その逆変換を行う副プログラムTOTIMEである。
基本情報技術者試験(平成25年 午後 問12 図1) ↩設問3
 は分、は秒を表す。分は0~99、秒は0~59の値とする。
(1) 副プログラムTOSECは、主プログラムから数字列として渡された時間を、数値の秒に変換して主プログラムに返す。  時間が格納されている領域の先頭アドレスはGR1に設定されて、主プログラムから渡される。秒はGR0に設定する。
(2) 副プログラムTOTIMEは、主プログラムから渡された数値の秒を、数字列の時間に変換して主プログラムに返す。  秒はGR0に、結果の数字列の時間を格納する領域の先頭アドレスはGR1に設定されて、主プログラムから渡される。
(3) 副プログラムから戻るとき、汎用レジスタGR1~GR7の内容は元に戻す。
基本情報技術者試験(平成25年 午後 問12 プログラム1)
基本情報技術者試験(平成25年 午後 問12 プログラム2)

設問1:

問題文を見る
 プログラム1, 2中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:JMI CONT  イ:JNZ CONT  ウ:JUMP CONT  エ:JZE CONT   b, cに関する解答群  ア:GR0  イ:GR1  ウ:GR2  エ:GR3  オ:GR4  カ:GR5

模範解答

a:イ、b:カ、c:ア

解説

解答の導き方

1. TOSECは、時間の各桁を順に使って秒数を計算します
問題文では、時間を「は分、は秒」としています。TOSECは、この4桁を左から順に読み取ります。
GR0などのGRは、計算中の値を一時的に置く汎用レジスタ(プログラムが使う作業場所)です。行7の「AND GR0,=#000F」は、GR0の下位4ビットを取り出す処理です。数字の文字コードから、計算に使う数字の値を取り出しています。
処理の中心は、行8で前の計算結果に次の桁を足し、行11以降で必要に応じて掛け算をすることです。行24の「VALUE1 DC 10,6,10」によって、掛ける値は順に10、6、10となります。
このため、計算は次の形になります。
これは、次の式と同じです。
つまり、分を秒に直し、さらに秒の部分を加えています。特に、分の値に掛ける60は、行11以降の「6を掛ける処理」と、その後の「10を掛ける処理」に分けて計算されています。
2. aには、掛け算の途中で繰返しを続ける条件を入れます
行13の「SRL GR4,1」は、GR4を右に1ビットずらす命令です。右端から出たビットが1なら、行14の「JOV INCR」で行19へ進み、現在のGR0をGR5に加えます。行20の「SLL GR0,1」ではGR0を左に1ビットずらし、次のビットに対応した計算を準備します。
ここで、GR4は掛ける値を入れているレジスタです。右にずらすたびに値が小さくなり、最後には0になります。GR4がまだ0でなければ、次のビットについて計算する必要があります。そのため、行15ではGR4が0でない間だけ行20の「CONT」へ進む条件分岐を使います。
必要なのは「JNZ CONT」です。JNZは、直前の結果が0でないときに分岐する命令です。解答群ではイです。GR4が0になったときは分岐せず、行16以降へ進んで次の桁を読み取ります。
3. TOTIMEでは、商を各桁に、余りを最後の桁に使います
TOTIMEは、行22の「VALUE2 DC 600,60,10」にある値を順に使い、秒数から時間の各桁を取り出します。行7~11では、GR0からGR4を繰り返し引き、その回数をGR5に数えています。
GR0がGR4より小さくなったところで行9~10の繰返しを終えるため、GR5には商が、GR0には余りが残ります。
割る値(GR4)商(GR5)余り(GR0)
600分の十の位600未満
60分の一の位60未満
10秒の十の位0~9
600秒は10分なので、最初に600で割った商が分の十の位になります。続けて60で割った商が分の一の位、10で割った商が秒の十の位です。最後に残った余りが秒の一の位です。
4. bは商のGR5、cは最後に残る余りのGR0です
行12~13では、商を文字にして格納します。行9で割った回数を数えているので、商が入っているのはGR5です。したがって、bにはGR5を入れます。解答群ではカです。
行18~19では、最後の桁を文字にして格納します。この時点でGR0には10で割った余り、つまり秒の一の位が残っています。したがって、cにはGR0を入れます。解答群ではアです。
「OR GR5,=’0’」や「OR GR0,=’0’」は、数値の桁に文字 ’0’ の文字コードを組み合わせ、数字の文字に変える処理です。その後のST命令で、変換した文字をGR1が指す領域へ格納します。

誤りやすいポイント

  • 「JNZ CONT」は、GR4が0でない間だけ掛け算の処理を続けます。GR4が0になったら次の桁へ進むため、無条件に分岐する命令は使えません。
  • TOTIMEでは、GR5が商、GR0が余りです。商を数えるためにGR5を増やし、GR0から割る値を引いている点に注目してください。
  • 最後の桁だけは、割り算の商ではなく余りを使います。秒の一の位は、10で割った余りとしてGR0に残ります。
  • OR命令の前後で、数値の桁を格納するレジスタを取り違えないようにしましょう。

FAQ

Q: VALUE1の「6」は、なぜ必要なのですか?
A: 分を秒に直すには60を掛けます。このプログラムでは、分の2桁を読み取った後に「6を掛ける」処理を行い、その後で秒の十の位を読む際に「10を掛ける」処理を行います。合わせて60を掛けた計算になります。
Q: RPUSHやRPOPを行っても、格納した数字は残りますか?
A: 残ります。RPUSHとRPOPは汎用レジスタの内容を退避・復元する命令です。ST命令で格納した結果の数字列は、別の記憶領域に書き込まれているため消えません。
Q: 秒数から最初に600で割るのはなぜですか?
A: 600秒は10分です。100分未満の時間を4桁で表すとき、最初の桁は「10分が何個あるか」を表します。そのため、まず600で割って分の十の位を求めます。

関連キーワード: シフト演算、条件分岐、2進数、基数変換、文字コード

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 次の記述中のに入れる正しい答えを、解答群の中から選べ。    プログラム1を1回呼び出したとき、行番号19のADDA命令はd回実行される。  プログラム2に渡された秒が10進数で274であるとき、行番号10のSUBA命令はe回実行される。   解答群  ア:3  イ:6  ウ:7  エ:10  オ:19  カ:272  キ:274

模範解答

d:イ、e:ウ

解説

解答の導き方

この問題では、プログラム1が数字列の時間を秒に変換するときの加算回数と、プログラム2が秒を数字列の時間に変換するときの減算回数を数えます。
GR(General Register:汎用レジスタ)は、CPU(Central Processing Unit:コンピュータの計算や命令の実行を行う装置)の中で、計算途中の値などを一時的に置く場所です。
プログラム1の行番号19について
プログラム1は、時間の4桁を左から順に処理します。行番号4でループ回数を4に設定し、行番号9で処理した桁数を1ずつ減らします。行番号10のJZEは、ループ回数が0になったときに処理を終える命令です。そのため、最後の桁では行番号19の加算処理を行いません。
時間の桁を左から順に 、、、 とすると、行番号24のVALUE1にある値は、それぞれの桁を次の桁と結び付けるために使われます。
  • の後は、10を掛けます。
  • の後は、6を掛けます。
  • の後は、10を掛けます。
  • 最後の の後は、掛け算をしません。
例えば、分の2桁は「 に10を掛けて を足す」ことで分の値になります。その後、秒に直すために6と10を掛けます。これは、 だからです。
行番号19で加算するかどうかは、掛ける値の2進数(0と1で数を表す方法)の桁によって決まります。行番号13のSRL(Shift Right Logical:論理的に右へずらす命令)は、GR4のビットを右へずらします。ずらして外に出たビットが1なら、行番号14のJOVによって行番号19へ進み、加算します。つまり、掛ける値の「1」のビット1つにつき、行番号19が1回実行されます。
  • 10は2進数で1010なので、「1」は2個です。行番号19は2回実行されます。
  • 6は2進数で110なので、「1」は2個です。行番号19は2回実行されます。
  • 10は2進数で1010なので、「1」は2個です。行番号19は2回実行されます。
したがって、合計は 回です。選択肢ではイに当たります。
プログラム2の行番号10について
プログラム2は、GR0に入った秒から、VALUE2の値を繰り返し引いて、各桁の値を求めます。行番号22のVALUE2には、600、60、10が順に格納されています。
行番号7のCPAはGR0とGR4を比較し、行番号8のJMIはGR0がGR4より小さいときに次の値へ進む命令です。GR0がGR4以上なら、行番号10でGR4を引きます。したがって、行番号10の実行回数は、各値を何回引けるかを数えれば分かります。
GR4の値引き算の様子行番号10の実行回数引き算後に残る値
600274は600より小さいため、引きません0回274
60274 → 214 → 154 → 94 → 344回34
1034 → 24 → 14 → 43回4
60を4回引いた後は34になり、60より小さいため、次の比較で引き算を終えます。同じように、10は3回引いた後に4が残ります。
よって、行番号10の実行回数は 回です。選択肢ではウに当たります。

誤りやすいポイント

  • プログラム1では、4桁すべてで掛け算をするわけではありません。行番号10で最後の桁に達すると、行番号19の処理より先に終了します。
  • プログラム1の行番号19の回数は、掛ける値そのものではなく、その値の2進数で「1」になっている桁の数で決まります。
  • プログラム2では、比較した回数ではなく、実際に行番号10で引き算した回数を数えます。GR0がGR4より小さいときは引き算しません。

FAQ

Q: プログラム1では、時間の数字が変わると行番号19の回数も変わりますか?
A: この問題の範囲では、回数は掛ける値の10、6、10によって決まります。GR0の数字が何であっても、掛ける値の「1」のビットごとに行番号19が実行されます。
Q: プログラム2で、274から60を4回引いた後に、もう一度引かないのはなぜですか?
A: 4回引くと34が残ります。34は60より小さいため、これ以上60を引くと負の値になります。行番号8で次の値へ進みます。
Q: なぜプログラム2は600、60、10の順に引くのですか?
A: 600秒のまとまり、60秒のまとまり、10秒のまとまりの順に数えることで、時間の各桁を求められるからです。最後に残った秒が1桁目になります。

関連キーワード: レジスタ、アセンブリ言語、論理シフト、ビット演算、繰返し減算

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 1チーム4名の選手の10km走のタイムの平均値を求めて出力する副プログラムAVERAGEを作成した。プログラム3中のに入れる正しい答えを、解答群の中から選べ。   (1) 主プログラムから、図2に示すデータが格納されている領域の先頭アドレスがGR1に設定されて渡される。4名の選手のタイムは図1に示す数字列の時間の形式で格納されている。
基本情報技術者試験(平成25年 午後 問12 図2)
(2) 平均値は、図1に示す数字列の時間の形式で出力する。1秒未満は切り捨てる。 (3) 副プログラムから戻るとき、汎用レジスタGR1〜GR7の内容は元に戻す。
基本情報技術者試験(平成25年 午後 問12 プログラム3)
解答群  ア:ADDA GR4,GR0  イ:LD GR4,GR0  ウ:SUBA GR4,GR0  エ:SLL GR4,1  オ:SLL GR4,2  カ:SRL GR4,1  キ:SRL GR4,2

模範解答

f:ア、g:キ

解説

解答の導き方

このプログラムは、4名のタイムをいったん秒に直して平均を求め、最後に「分・秒」の数字列に戻します。時間を秒に直すと、足し算や割り算をしやすくなるためです。
  1. GR4に4名分の秒を足していきます。
    プログラムでは、最初に「GR4」を0にしています。GR4は、計算途中の合計を置いておく場所です。
    ループの中では「LD GR1,0,GR3」で1名分のタイムを取り出し、「CALL TOSEC」で副プログラムTOSECを呼び出しています。副プログラムは、まとまった処理を呼び出して使えるようにしたものです。TOSECは数字列のタイムを秒に変換し、その秒をGR0に返します。
    つまり、毎回GR0には、その選手のタイムを秒にした値が入ります。一方、GR4には、それまでに処理した選手の秒の合計を残しておく必要があります。
    ループの回数GR0に入る値GR4に加算した後
    1回目1人目の秒
    2回目2人目の秒
    3回目3人目の秒
    4回目4人目の秒
    そのため、空欄fではGR0の値をGR4に加える必要があります。加算命令の「ADDA GR4,GR0」を選びます。
    「LD GR4,GR0」では、これまでの合計をGR0の値で置き換えてしまいます。「SUBA GR4,GR0」では引き算になってしまいます。どちらも4名分の合計を求められません。
    また、TOSECを呼び出すたびにGR0は新しい選手の秒で更新されますが、問題文には副プログラムから戻るときGR1からGR7の内容を元に戻すとあります。そのため、合計を入れているGR4の値は、次のループでも保たれます。
  2. 4名分の合計を4で割ります。
    4回のループが終わると、GR4には4名分の秒の合計が入っています。平均を求める式は次のとおりです。
    空欄gでは、GR4の値を4で割る必要があります。選択肢の「SRL」は論理右シフト(Shift Right Logical:ビット列を右へずらす処理)です。右へ1ビットずらすと値は2で割られ、右へ2ビットずらすと4で割られます。
    したがって、「SRL GR4,2」を実行すると、GR4の合計を4で割った値になります。割り切れない端数は切り捨てられるため、「1秒未満は切り捨てる」という条件にも合います。
  3. 平均を数字列の時間に戻します。
    「LD GR0,GR4」で平均の秒をGR0に移し、「CALL TOTIME」で数字列の時間に変換します。TOTIMEが変換した結果はRESULTに格納され、最後に「OUT RESULT,LEN4」で出力されます。

誤りやすいポイント

  • GR0はループごとに現在の選手の秒に変わります。4名分の合計を残す場所はGR4なので、GR0の値をGR4に加える必要があります。
  • 「LD GR4,GR0」は加算ではありません。GR4の値を上書きするため、4名分の合計が残りません。
  • 平均を求めるのは、4名分の秒を合計した後です。各選手のタイムを4で割ってから足すのではありません。
  • 「SRL GR4,1」では2で割るだけです。4で割るには、右へ2ビットずらす「SRL GR4,2」が必要です。

FAQ

Q:なぜ数字列の時間のまま平均を計算しないのですか?
A:時間は、秒が60になると分に繰り上がります。数字列の各桁をそのまま足すと正しい時間の計算にならないため、いったん秒に変換してから合計と平均を求めます。
Q:右に2ビットずらすと、なぜ4で割ったことになるのですか?
A:2進数では、右に1ビットずらす操作が2で割ることに相当します。2ビットずらすと2で2回割るため、4で割ることになります。
Q:TOSECを呼び出しても、GR4の合計が消えないのはなぜですか?
A:問題文では、副プログラムから戻るときにGR1からGR7の内容を元に戻すと定めています。GR4も元の値に戻るため、それまでの合計を保ったまま次の選手の秒を加えられます。

関連キーワード: 汎用レジスタ、累算、論理右シフト、整数除算、時間変換

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について