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

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


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

〔プログラムの説明〕  連続したn語を16×nビットのビット列とみなし、ビット列Aとする。ビット列Aの(p+1)ビット目からのqビットを、別のqビットのビット列Bで置き換える副プログラムREPLACEである。置換えの概要を図1に示す。  ここで、p≧0, 1≦q≦16, p+q≦16×nとする。
基本情報技術者試験(平成21年 午後 問12 図1)
(1) ビット列Aの先頭アドレスは、GR1に設定されて主プログラムから渡される。 (2) ビット列BはGR0に左詰めで設定され、GR0の残りの部分は0で埋められて主プログラムから渡される。ビット列BとGR0の関係を図2に示す。
基本情報技術者試験(平成21年 午後 問12 図2)
(3) 値pはGR2に、値qはGR3に設定されて主プログラムから渡される。 (4) 副プログラムから戻るとき、汎用レジスタGR1〜GR7の内容は元に戻す。
基本情報技術者試験(平成21年 午後 問12 プログラム1)

設問1:

問題文を見る
 次の記述中のに入れる正しい答えを、解答群の中から選べ。    主プログラムから渡されたp, qの値及びGR0の内容は、次のとおりであった。    p: 55  q: 12  GR0: 1011000111010000    行番号8のSUBAの実行直後におけるGR2の値はaであり、GR4の値はbである。
 行番号17のSLLの実行直後におけるGR0の内容はcであり、GR5の内容はdである。   a, bに関する解答群  ア:1  イ:5  ウ:7  エ:9  オ:11  カ:15   c, dに関する解答群  ア:0000000001011000  イ:0000000101100011  ウ:1010000000000000  エ:1110100000000000

模範解答

a:ウ、b:エ、c:イ、d:ウ

解説

解答の導き方

この問題では、行番号8の実行直後にGR2とGR4がいくつになるかを求めます。その後、行番号17の実行直後にGR0とGR5がどのようなビット列になっているかを確認します。
GRは、計算途中の値を一時的に保存する汎用レジスタです。ここでは各レジスタが16ビットの値を扱います。
1. 行番号8直後のGR2とGR4
主プログラムから渡される値は、、です。
行番号3で、GR2に入っているがGR4にコピーされます。続く行番号4のSRLは、ビット列を右にずらす命令です。4ビット右にずらすと、GR4はになります。
行番号6では、GR2と=#000FとのビットごとのANDを取ります。ビットごとのANDは、同じ位置のビットが両方とも1のときだけ、結果を1にする処理です。=#000Fは下位4ビットだけが1なので、この処理でGR2の下位4ビットが残ります。55を16で割った余りは7なので、GR2は7になります。
行番号7でGR4に16を設定し、行番号8でGR2を引きます。したがって、GR4はです。
行番号処理後の値
4GR4:3
6GR2:7
8GR4:9
よって、行番号8の直後はGR2が7、GR4が9です。解答群では、GR2の7はウ、GR4の9はエです。
2. 行番号17直後のGR0とGR5
問題文には「ビット列BはGR0に左詰めで設定され、GR0の残りの部分は0で埋められて」とあります。今回のGR0は1011000111010000です。
行番号9で、GR0の内容がGR5にコピーされます。この時点では、GR5も1011000111010000です。
行番号14では、GR0を行番号6で求めたGR2の値、つまり7ビット分、右にずらします。SRLは、右にずらした分だけ左側に0を入れる論理右シフトです。
1011000111010000を7ビット右にずらすと、GR0は0000000101100011になります。その後、GR0を変更する処理はないため、行番号17の実行直後もこの値のままです。
次に、行番号8で求めたGR4の値は9です。行番号16では、GR5を9ビット左にずらします。SLLは、左にずらした分だけ右側に0を入れる命令です。16ビットから左にはみ出したビットは捨てられます。
1011000111010000を9ビット左にずらすと、GR5は1010000000000000になります。行番号17でシフトされるのはGR7なので、GR5は変わりません。
したがって、行番号17の実行直後はGR0が0000000101100011、GR5が1010000000000000です。解答群では、GR0の値はイ、GR5の値はウです。

誤りやすいポイント

  • 行番号8では、行番号7でGR4に設定した16からGR2の値を引きます。GR4を「16−55」と計算しないようにしましょう。
  • 行番号6のANDは、GR2全体を0にする処理ではありません。=#000FとのビットごとのANDによって、GR2の下位4ビットを残します。
  • 行番号9でGR0の内容をGR5にコピーした後、行番号14でGR0が変わってもGR5は変わりません。別々のレジスタなので、それぞれの値を追いましょう。
  • 行番号17で変更されるのはGR7です。GR0とGR5は、行番号14と行番号16で変わった値のままです。

FAQ

Q: なぜ行番号6の実行後、GR2は7になるのですか?
A: を16で割ると、商は3、余りは7です。行番号4では右に4ビットずらして商に当たる部分を得て、行番号6では下位4ビットを残して余りに当たる部分を得ています。
Q: 行番号17ではGR7をシフトしているのに、GR5の値も変わりますか?
A: 変わりません。行番号17が変更するのはGR7です。GR5は行番号16でシフトされた後、そのままです。
Q: 左シフトで左にはみ出したビットはどうなりますか?
A: レジスタに保存できるのは16ビットなので、左にはみ出したビットは捨てられます。右側には、シフトした数だけ0が入ります。

関連キーワード: 論理シフト、算術シフト、ビット演算、汎用レジスタ、2進数

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

この設問をAIに質問する

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

 プログラム中のに入れる正しい答えを、解答群の中から選べ。   解答群  ア:ADDL  イ:AND  ウ:LD  エ:OR  オ:SLL  カ:SRL  キ:XOR

模範解答

e:イ、f:キ(順不同)

解説

解答の導き方

この設問では、プログラム中の e と f に入る命令を考えます。該当する行には「ビット列Bを入れる部分を0にする」とあります。まず置換え先のビットを0にし、そのあとでビット列Bを重ねる処理だと分かります。
ビット列Aは16ビットずつの語に分かれています。行4と行5では、置換え位置を含む第i語に、ビット列Aの先頭アドレスが入ったGR1を移動します。GRは汎用レジスタ(General Register:値を一時的に保存する場所)です。
行6では、の下位4ビットを取り出します。これは、置換え位置が第i語の先頭から何ビット進んだ位置にあるかを示します。その位置をとすると、は0〜15です。
次に、置換え対象のビットを示すマスクを作ります。マスクとは、処理したい位置を1、それ以外を0にしたビット列です。行10でGR6に設定する「=#8000」は、最上位のビットだけが1の値です。行11でGR3をにしてから、行12のSRAでGR6を右にシフトします。SRAは算術右シフトで、符号を表す最上位ビットを保ちながら右にずらす命令です。最上位ビットが1の値を右にずらすため、上位のビットが1のマスクになります。
行14と行15では、ビット列Bとマスクをビット右にずらし、第i語の置換え位置に合わせます。一方、行16と行17では、ずらす前にGR5とGR7にコピーしておいたビット列Bとマスクを、ビット左にずらします。これにより、置換え対象が第i語からはみ出した部分も、第(i+1)語で処理できます。
ここで、行19と行20の処理を、置換え対象の1ビットについて考えます。元のビットを、その位置のマスクをとします。
行19のANDは論理積です。2つのビットが両方とも1のときだけ、結果が1になります。行19で「AND GR6,GR2」を実行すると、マスクと元の語の両方が1であるビットだけがGR6に残ります。
続いて行20のXORは排他的論理和です。2つのビットが異なるとき、結果が1になります。行20で「XOR GR2,GR6」を実行すると、元の語のうち置換え対象の範囲にある1だけが0になります。
マスク元のビットANDの結果XOR後の元のビット
1000
1110
0000
0101
つまり、マスクが1の範囲は元の値に関係なく0になり、マスクが0の範囲は元の値がそのまま残ります。これで、ビット列Bを入れる場所だけを空けられます。
行21ではORを使って、GR0にあるビット列BをGR2に加えます。ORは、どちらか一方でも1なら結果が1になる演算です。置換え先は先に0にしてあるため、ビット列Bの1は1として入り、0は0のままです。第(i+1)語についても、行24と行25で同じように置換え先を0にしてから、行26でビット列Bを加えます。
以上から、置換え先のビットを取り出す行19と行24にはANDが入り、そのビットを元の語から0にする行20と行25にはXORが入ります。

誤りやすいポイント

  • ANDだけで置換え先を0にするわけではありません。ANDで元の語のうち対象範囲にある1を取り出し、その結果をXORで元の語から消します。
  • 置換え対象を表すマスクを、そのまま元の語とXORすると、対象範囲にある0が1になってしまいます。先にANDで元の1だけを取り出す必要があります。
  • 置換え対象が第i語だけに収まるとは限りません。第i語と第(i+1)語にまたがる場合に備え、プログラムは両方の語を処理します。

FAQ

Q: 先に置換え先を0にするのはなぜですか?
A: 元の値が残ったままビット列BをORすると、元の1が残り、ビット列Bの0を正しく反映できないためです。置換え先を先に0にすれば、ビット列Bの値をそのまま入れられます。
Q: 行19と行20の順番を逆にしてもよいですか?
A: できません。ANDで元の語のうち置換え対象範囲にある1を取り出してから、XORでその1を消す必要があります。
Q: 置換え対象が第i語の中だけにある場合も、第(i+1)語の値は変わりますか?
A: 変わりません。置換え対象外の位置ではマスクが0なので、行24と行25の処理で元の値がそのまま残ります。

関連キーワード: ビット演算、論理積、排他的論理和、ビットマスク、ビットシフト

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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