基本情報技術者 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とする。

(1) ビット列Aの先頭アドレスは、GR1に設定されて主プログラムから渡される。
(2) ビット列BはGR0に左詰めで設定され、GR0の残りの部分は0で埋められて主プログラムから渡される。ビット列BとGR0の関係を図2に示す。

(3) 値pはGR2に、値qはGR3に設定されて主プログラムから渡される。
(4) 副プログラムから戻るとき、汎用レジスタGR1〜GR7の内容は元に戻す。

設問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はです。
よって、行番号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ビットを残して余りに当たる部分を得ています。
A: を16で割ると、商は3、余りは7です。行番号4では右に4ビットずらして商に当たる部分を得て、行番号6では下位4ビットを残して余りに当たる部分を得ています。
Q: 行番号17ではGR7をシフトしているのに、GR5の値も変わりますか?
A: 変わりません。行番号17が変更するのはGR7です。GR5は行番号16でシフトされた後、そのままです。
A: 変わりません。行番号17が変更するのはGR7です。GR5は行番号16でシフトされた後、そのままです。
Q: 左シフトで左にはみ出したビットはどうなりますか?
A: レジスタに保存できるのは16ビットなので、左にはみ出したビットは捨てられます。右側には、シフトした数だけ0が入ります。
A: レジスタに保存できるのは16ビットなので、左にはみ出したビットは捨てられます。右側には、シフトした数だけ0が入ります。
関連キーワード: 論理シフト、算術シフト、ビット演算、汎用レジスタ、2進数
設問2:
問題文を見る プログラム中のに入れる正しい答えを、解答群の中から選べ。
解答群
ア: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になります。
つまり、マスクが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の値をそのまま入れられます。
A: 元の値が残ったままビット列BをORすると、元の1が残り、ビット列Bの0を正しく反映できないためです。置換え先を先に0にすれば、ビット列Bの値をそのまま入れられます。
Q: 行19と行20の順番を逆にしてもよいですか?
A: できません。ANDで元の語のうち置換え対象範囲にある1を取り出してから、XORでその1を消す必要があります。
A: できません。ANDで元の語のうち置換え対象範囲にある1を取り出してから、XORでその1を消す必要があります。
Q: 置換え対象が第i語の中だけにある場合も、第(i+1)語の値は変わりますか?
A: 変わりません。置換え対象外の位置ではマスクが0なので、行24と行25の処理で元の値がそのまま残ります。
A: 変わりません。置換え対象外の位置ではマスクが0なので、行24と行25の処理で元の値がそのまま残ります。
関連キーワード: ビット演算、論理積、排他的論理和、ビットマスク、ビットシフト



