平成23年特別試験午後問題 問1

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】

問1 ハードウェア

機械語命令に関する次の記述を読んで,設問1,2に答えよ。

 この機械語が実行されるCPUの1語は16ビットで,CPUには1語長の汎用レジスタが四つ(レジスタ番号0~3)ある。主記憶容量は1,000語(番地0~999) あり,命令語は700番地以降に格納される。命令語の形式は図1に示すとおりである。命令には1語命令と2語命令があり,1語命令の場合は1語目だけで構成される。
pm01_1.gif
 図1で使用している記号の説明を表1に,命令の実効アドレスの算出方法を表2に,命令の対象となるデータが設定されているレジスタ(以下,ソースレジスタという)の指定方法を表3に,命令の仕様(一部)を表4に示す。数字の末尾にhが付いているものは16進数表記である。
pm01_2.gif

設問1

次の記述中の に入れる正しい答えを,解答群の中から選べ。

 命令を実行する前のレジスタの内容は,図2のとおりとする。この状態で図3のプログラムを先頭の700番地から順に実行した。
 命令語2の実行が終わった時点での,レジスタ番号1のレジスタの内容はaである。命令語5の実行が終わった時点での,レジスタ番号1のレジスタの内容はbであり,レジスタ番号3のレジスタの内容はcである。
pm01_3.gif
a,b,c に関する解答群
  • 100
  • 200
  • 300
  • 400
  • 500
  • 600
解答選択欄
  • a:
  • b:
  • c:
  • a=
  • b=
  • c=

解説

プログラムをトレースする前に、16ビットで構成される機械語の1語について確認しておきましょう。
pm01_1.gif
上位8ビットが命令コード、下位8ビットがデータ部です。

この問題を解く基本的な流れとしては、各命令ごとに
  1. 命令の内容を2進数に変換する
  2. 2つのレジスタ番号(r1、r2()またはX)と、2つのフラグ(D、I)の値を確認する
  3. 表2、表3をもとに実行アドレスの算出、またはソースレジスタを確認する
  4. 命令コードを確認し、処理内容をレジスタに反映する
を繰り返していくことになります。

それでは、ここから命令ごとに内容を確認していきましょう。なお問題問題文中にも注記がありますが、命令文の最後尾に付加されている"h"は、数字が16進表記であることを示す記号です。

初期状態のレジスタの内容は以下の通りです。
pm01_6.gif
[命令語12042h]
16進表記である命令の中で、上2けたは変換しなくてもそのまま命令コードを表しているので、2進数に変換するのはデータ部だけで済みます。この命令"2042h"では"20"の部分が命令コードを表します。
  1. データ部を2進数に変換42h→01000010
  2. 2進数のデータ部から各値を確認 r1=1、r2=0、D=1、I=0
  3. 表3より、D=1、I=0なので、r2で指定されたレジスタがソースレジスタとなる。
命令コードは20h、r1=1、r2=0なので、処理内容は「レジスタ番号0の内容(100)を、レジスタ番号1に設定する」になります。
処理の結果、レジスタ番号1の内容は"100"になります。
pm01_7.gif
[命令語210D2h]
  1. データ部を2進数に変換D2h→11010010
  2. 2進数のデータ部から各値を確認 r1=3、r2=1、D=1、I=0
  3. 表3より、D=1、I=0なので、r2で指定されたレジスタがソースレジスタとなる。
命令コードは10h、r1=3、r2=1なので、処理内容は「レジスタ番号1の内容(100)を、レジスタ番号3に足し込む」になります。
処理の結果、レジスタ番号3の内容は"500"になります。
pm01_8.gif
aア:100[命令語33090h、0000h]
  1. 1語目のデータ部を2進数に変換 90h→10010000
  2. 2進数のデータ部から各値を確認 r1=2、X=1、D=0、I=0
  3. 表2より、D=0、I=0なので、実効アドレスは、adr+[Xで指定されたレジスタ]となる。
  4. adr=0(2語目の内容)、X=1なので、実効アドレスは、
     adr+[Xで指定されたレジスタ]=0+[レジスタ番号1]=0+100=100
    と算出される。
命令コードは30h、r1=2、実効アドレス=100なので、処理内容は「レジスタ番号2の内容(300)を、主記憶の100番地に格納する」になります。
処理の結果、主記憶の100番地に"300"が格納されます。
pm01_9.gif
[命令語41013h]
  1. データ部を2進数に変換13h→00010011
  2. 2進数のデータ部から各値を確認 r1=0、r2=1、D=1、I=1
  3. 表2より、D=1、I=1なので、実効アドレスは、adr+[r2で指定されたレジスタ]となる。
  4. 実効アドレスは、
     [r2で指定されたレジスタ]=[レジスタ番号1]=100
    と算出される。
命令コードは10h、r1=0、実効アドレス=100なので、処理内容は「主記憶の100番地の内容(300)を、レジスタ番号0に足し込む」になります。
処理の結果、レジスタ番号0の内容は"400"になります。
pm01_10.gif
[命令語52042h]
  1. データ部を2進数に変換42h→01000010
  2. 2進数のデータ部から各値を確認 r1=1、r2=0、D=1、I=0
  3. 表2より、D=1、I=0なので、r2で指定されたレジスタがソースレジスタとなる。
命令コードは20h、r1=1、r2=0なので、処理内容は「レジスタ番号0の内容(400)を、レジスタ番号1に設定する」になります。
処理の結果、レジスタ番号1の内容は"400"になります。
pm01_11.gif
bエ:400
 cオ:500

[命令語6FF02h]
命令コードが、プログラム終了を実行する"FFh"となるためプログラムはここで終了します。

設問2

レジスタと主記憶の内容が図4に示す値のとき,レジスタ番号1のレジスタに100を設定する命令語の記述として誤りであるものを,解答群の中から選べ。
pm01_4.gif
解答群
pm01_5.gif
解答選択欄
  •  
  •  

解説

opとr1は同じなので、各命令語で実効アドレス、またはソースレジスタの内容が"100"になっていれば、20h命令によりレジスタ番号1に"100"が設定されます。つまり実効アドレス、またはソースレジスタの内容を確認していくことで誤っている命令語がわかります。
  • D=0、I=1なので、実効アドレスは[adr+[Xで指定されたレジスタ]]で算出します。
     X=2、adr=0なので、実効アドレスは [0+[レジスタ番号2]]=[0+100]=[100]=101
    r1にセットされるのは、主記憶101番地の内容"100"になります。
  • >D=1、I=0なので、r2で指定されたレジスタがソースレジスタになります。
     r2=2なので、ソースレジスタはレジスタ番号2となり、その内容は100です。
  • D=0、I=0なので、実効アドレスはadr+[Xで指定されたレジスタ]で算出します。
     X=3、adr=0なので、実効アドレスは0+[レジスタ番号3]=0+101=101
    r1にセットされるのは、主記憶101番地の内容"100"になります。
  • D=0、I=1なので、実効アドレスは[adr+[Xで指定されたレジスタ]]で算出します。
     X=3、adr=0なので、実効アドレスは [0+[レジスタ番号3]]=[0+101]=[101]=100
    r1にセットされるのは、主記憶100番地の内容"101"になるため、これが正解です。
  • D=1、I=1なので、実効アドレスは[r2で指定されたレジスタ]で算出します。
     X=3なので、実効アドレスは [レジスタ番号3]=101
    r1にセットされるのは、主記憶101番地の内容"100"になります。

Pagetop