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

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


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

〔プログラム1の説明〕  副プログラムBITINSは、図1に示すように、ビット列A(長さ16ビット)をビット列B(長さ16ビット)の指定された位置に挿入し、ビット列C(長さ32ビット)を作成する。図1中のn (0 ≦ n ≦ 16)は、挿入位置(先頭からのビット数)を表す。
基本情報技術者試験(平成27年 午後 問12 図1)
(1) GR0~GR3には、それぞれ次の内容が設定されて、主プログラムから渡される。  GR0:ビット列A  GR1:ビット列Bが格納されている領域のアドレス  GR2:n  GR3:ビット列Cを格納する2語の領域の先頭アドレス
(2) 副プログラムから戻るとき、汎用レジスタGR1~GR7の内容は元に戻す。
基本情報技術者試験(平成27年 午後 問12 プログラム1)

設問1:

問題文を見る
 プログラム1中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:0  イ:8  ウ:16  エ:32   bに関する解答群  ア:SLL GR0,0,GR2  イ:SLL GR0,0,GR6  ウ:SRL GR0,0,GR2  エ:SRL GR0,0,GR6

模範解答

a:ウ、b:ウ

解説

解答の導き方

このプログラムは、ビット列Bを途中で分け、その間にビット列Aを挿入して、32ビットのビット列Cを作ります。図1では、ビット列Bの左側が長さの部分、右側が長さの部分です。
1. aには、ビット列Aの長さを入れます。
問題文には、ビット列Aの長さが「16ビット」とあります。また、3行目で定数aをGR6に入れ、4行目でGR2の値を引いています。つまり、GR6に計算されるのはです。
この値は、ビット列Aのうち、最初の出力語に入る部分の長さです。したがって、aは16となり、解答群ではウです。
2. Bの左右の部分が、別々のレジスタに取り出されます。
汎用レジスタは、計算中の値を一時的に保持する場所です。5行目から11行目では、GR1とGR4を使ってビット列Bの左右を分けています。
  • GR1には、ビット列Bの左側のビットが、左寄せで残ります。
  • GR4には、ビット列Bの右側のビットが、右寄せで残ります。
SLL(Shift Left Logical:空いた位置に0を入れて左へずらす操作)とSRL(Shift Right Logical:空いた位置に0を入れて右へずらす操作)を組み合わせ、必要な部分だけを残しています。
3. bでは、ビット列Aの最初の部分をGR0に残します。
出力するビット列Cの前半は、ビット列Bの左側ビットと、ビット列Aの最初のビットをつないだものです。
GR1には、ビット列Bの左側ビットが左寄せで残っています。これに続けるビット列Aの最初のビットは、右寄せにする必要があります。そこで、ビット列Aをビットだけ右にずらします。
つまり、12行目はSRLでGR0をGR2()だけ右へずらす処理です。解答群ではウです。ずらしたビット列AとGR1を14行目でOR(論理和:対応するビットのどちらかが1なら1にする演算)すると、出力の前半ができます。
4. 後半では、保存しておいたビット列Aを使います。
7行目では、ビット列AをGR5にもコピーしています。GR0は12行目で右にずらされますが、後半を作るときには元のビット列Aも必要だからです。
13行目では、GR5をビット左にずらし、ビット列Aの最後のビットを左寄せにします。GR4に残したビット列Bの右側ビットと15行目でORすると、出力の後半ができます。

誤りやすいポイント

  • aに32を選ぶこと
    ビット列Cは32ビットですが、3行目で必要なのは、長さ16ビットのビット列Aを分けるための値です。したがって、aは16です。
  • bで左シフトを選ぶこと
    最初の出力語に入れるビット列Aの部分は、右側に寄せる必要があります。GR0を左にずらすのではなく、右にずらすため、SRLを選びます。
  • bのシフト数をにすること
    GR0から最初のビットを取り出すには、右へビットずらします。ビット左にずらす処理は、後半を作る13行目でGR5に対して行っています。

FAQ

Q: なぜビット列AをGR5にもコピーするのですか?
A: GR0は12行目で右にずらされます。一方、後半を作るときは、ビット列Aの最後のビットが必要です。GR5に元の値を残しておけば、後半も作れます。
Q: 前半と後半をつなぐとき、なぜORを使うのですか?
A: それぞれのビット列を、重ならない位置に寄せてからORで合わせています。片方が入る位置にもう片方が重ならないため、ORを使って一つの語にできます。
Q: SRLでは、ずらして空いた位置に何が入りますか?
A: 論理右シフトでは、空いた位置に0が入ります。そのため、残したいビットを所定の位置に寄せながら、不要な部分を外へ押し出せます。

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

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

この設問をAIに質問する

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

 次の記述中のに入れる正しい答えを、解答群の中から選べ。    主プログラムから渡されたnが10で、ビット列Aとビット列Bが図2のとき、行番号15のOR命令実行直前のGR4の内容はcであり、GR5の内容はdである。
基本情報技術者試験(平成27年 午後 問12 図2)
解答群  ア:0000 0000 0001 0111  イ:0000 0000 0001 1000  ウ:0000 0010 1001 0110  エ:0000 0011 1011 1100  オ:0101 1100 0000 0000  カ:0110 0000 0000 0000  キ:1010 0101 1000 0000  ク:1110 1111 0000 0000

模範解答

c:イ、d:キ

解説

解答の導き方

この設問では、行番号15のOR命令を実行する直前のGR4とGR5を求めます。汎用レジスタ(GR:General Register)は、計算途中の値を一時的に置いておく場所です。
1. シフト数を求めます
ビット列Aは16ビットで、設問ではです。行番号3のaはビット列Aの長さを表すので、GR6には16が入ります。行番号4では、GR6からGR2の値を引くため、
  • GR6:
となります。
2. GR4の値を追います
行番号6で、GR4にはビット列Bの値が入ります。図2のビット列Bは「1110 1111 0001 1000」です。
行番号10ではGR4を左に10ビットずらし、行番号11ではその値を右に10ビットずらします。SLL(Shift Left Logical:論理左シフト)では左にはみ出したビットが捨てられ、SRL(Shift Right Logical:論理右シフト)では左側に0が入ります。
この2つの処理をすると、最初のビット列Bのうち右端の6ビットだけが残り、次の値になります。
  • 行番号10の後:0110 0000 0000 0000
  • 行番号11の後:0000 0000 0001 1000
したがって、行番号11の後のGR4は「0000 0000 0001 1000」です。行番号12ではGR0が処理され、行番号14ではGR1が処理されます。GR4の値は変わらないため、行番号15の直前のGR4も同じです。解答群ではイです。
3. GR5の値を追います
行番号7で、GR5にはビット列Aの値「0101 1110 1001 0110」が入ります。行番号13ではGR5を左にGR6の値、つまり6ビットずらします。
16ビットの範囲から左にはみ出したビットは捨てられ、右端には0が入ります。その結果、GR5は次の値になります。
  • 行番号13の後:1010 0101 1000 0000
行番号14はGR1を変更する命令なので、GR5の値は行番号15の直前も変わりません。解答群ではキです。

誤りやすいポイント

  • GR4の値を、行番号15のOR命令を実行した後の値と取り違えないようにします。問われているのは、命令を実行する直前の値です。
  • GR4の左シフトと右シフトは、ビット列B全体を元に戻す処理ではありません。左シフトでは上位側のビットが捨てられるので、右端の6ビットだけが残ります。
  • GR5の左シフトでは、16ビットからはみ出した左側のビットは残りません。元のビット列A全体がそのまま左に移動するわけではありません。

FAQ

Q: GR4をいったん左に10ビットずらすのはなぜですか?
A: 左にずらすことで、ビット列Bの右端6ビット以外を16ビットの範囲から押し出して捨てます。その後、右に10ビットずらすと、残った6ビットが右端にそろいます。
Q: GR5を左にずらすと、なぜ右端が0になるのですか?
A: 論理左シフトでは、空いた右端に0が入るためです。この問題ではGR5を6ビットずらすので、右端6ビットが0になります。
Q: OR命令は、ここで何をする命令ですか?
A: OR(Logical OR:論理和)は、対応する位置のビットのどちらか一方でも1なら、結果を1にする処理です。行番号15では、GR4とGR5のビットを組み合わせます。

関連キーワード: 論理左シフト、論理右シフト、ビットごとの論理和、汎用レジスタ、ビット列

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

この設問をAIに質問する

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

 連続するN語を16×Nビットから成るビット列Yとする。図3に示すように、ビット列X(長さ16ビット)をビット列Yの指定された位置に挿入し、N+1語のビット列Zを作成する副プログラムBITINSLを、副プログラムBITINSを使って作成した。図3中のm (0 ≦ m ≦ 16×N)は、挿入位置(先頭からのビット数)を表す。プログラム2中のに入れる正しい答えを、解答群の中から選べ。
基本情報技術者試験(平成27年 午後 問12 図3)
(1) GR0~GR4には、それぞれ次の内容が設定されて、主プログラムから渡される。  GR0:ビット列X  GR1:ビット列Yが格納されている領域の先頭アドレス  GR2:m  GR3:ビット列Zを格納するN+1語の領域の先頭アドレス  GR4:N
(2) 副プログラムから戻るとき、汎用レジスタGR1~GR7の内容は元に戻す。
基本情報技術者試験(平成27年 午後 問12 プログラム2)
解答群  ア:JMI FIN  イ:JMI INS  ウ:JPL FIN  エ:JPL INS  オ:JZE FIN  カ:JZE INS

模範解答

e:イ、f:オ

解説

解答の導き方

このプログラムは、長さが16ビットのビット列Xを、N語分のビット列Yの途中に挿入し、N+1語のビット列Zを作ります。
考えるポイントは、挿入位置mを「Yの何語目にあるか」と「その語の何ビット目か」に分けることです。
1. 挿入する位置が、現在の語より先かを判定します
GR2には挿入位置m、GR4にはビット列Yの語数Nが入っています。COPYはYの1語をZにコピーし、GR1とGR3を次の語へ進め、GR4を1減らします。
判定の箇所は「CPA GR2,=17」です。CPAは値を比較する命令です。この比較では、GR2が17より小さいか、17以上かを判定できます。JMIは比較結果が負の場合、つまりGR2が17より小さい場合に分岐します。
GR2が17以上なら、挿入位置は現在のYの語の中にはありません。そのため、現在の語をCOPYでコピーし、GR2から16を引いて、次の語について判定し直します。
一方、GR2が17より小さければ、現在の語の中に挿入位置があります。その位置をBITINSに渡します。したがって、eには「JMI INS」が入り、解答群ではイです。
17ではなく16を境目にする理由は、BITINSが語の中の挿入位置として0から16までを扱えるからです。たとえばmが16なら、現在の語の末尾が挿入位置です。ここでその語を先にコピーしてしまうと、挿入位置が次の語の先頭に移ります。特にmがY全体の末尾の場合、次の語は存在しません。そこで、残りが16のときも現在の語をBITINSに渡せるよう、17未満でINSへ進みます。
たとえば、mが17なら、まずYの1語をコピーしてGR2を1にします。次の判定では17未満なので、次の語の先頭から1ビット進んだ位置に挿入します。
2. BITINSの後に、残りの語があるかを判定します
INSではBITINSを呼び出します。BITINSは、現在のYの1語とビット列Xから、Zの2語分を作ります。その後、プログラムはGR1を1語分、GR3を2語分進めます。さらにGR4を1減らします。これは、現在のYの1語をBITINSで処理し終えたためです。
続いて、残ったYの語をCOPYでZへ移します。残りが0語なら、コピーする語はありません。この場合はFINへ進みます。GR4を1減らした直後に0かどうかを調べるので、fには「JZE FIN」が入り、解答群ではオです。JZEは、直前の演算結果が0の場合に分岐する命令です。
GR4が0でなければ分岐せず、LOOP2で残りをコピーします。COPYのたびにGR4が1減り、JNZによってGR4が0でない間はLOOP2を繰り返します。

誤りやすいポイント

  • GR2は、最初はビット列Yの先頭からの挿入位置です。LOOP1でYの1語をコピーするたびに16減るため、INSへ進む時点では現在の語の中の位置を表します。
  • mが16の場合も、BITINSで処理できます。挿入位置として16が認められているため、17未満かどうかで判定します。
  • fでは、GR4を減らした後の値を確認します。BITINSでYの1語を処理した結果、残りが0ならFINへ進みます。
  • LOOP2に入るのは、残りの語がある場合です。COPYの後にあるJNZは、GR4が0でない間、コピーを続けるための分岐です。

FAQ

Q: GR2から引く値が16なのはなぜですか?
A: Yの1語は16ビットだからです。語を1つコピーして挿入位置を次の語まで進めると、GR2から16を引けば、次の語の中での位置に直せます。
Q: BITINSを呼び出した後、GR1を1語分、GR3を2語分進めるのはなぜですか?
A: BITINSは、現在のYの1語から、Xを含むZの2語分を作るためです。次の処理では、Yの次の語と、Zのその次の位置を使います。
Q: mが0の場合は、LOOP1でCOPYしますか?
A: しません。GR2は17より小さいためINSへ進み、BITINSが現在のYの語の先頭にXを挿入します。

関連キーワード: ビット列、レジスタ、比較命令、条件分岐、ループ処理

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

この設問をAIに質問する

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

戦国ITクイズ機能

\ せっかくなら /

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

クイズ画面へ遷移する→

すぐに利用可能!

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

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