エンベデッドシステムスペシャリスト 2012年 午前2 問02
問題文
同一メモリ上で転送するとき、転送元の開始アドレス、転送先の開始アドレス、方向フラグ及び転送語数をパラメタとして指定することでブロック転送ができるCPUがある。図のようにアドレス1001から1004の内容をアドレス1003から1006に転送するとき、パラメタとして適切なものはどれか。ここで、転送は開始アドレスから1語ずつ行われ、方向フラグに0を指定するとアドレスの昇順に、1を指定するとアドレスの降順に転送を行うものとする。


選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
重複領域のブロック転送【午前2解説】
正解の理由
転送元はアドレス1001~1004、転送先はアドレス1003~1006です。転送元と転送先の範囲が重なっており、転送先のほうが高いアドレス側にあります。
この場合、低いアドレスから順に転送すると、転送先への書込みによって、まだ読み取っていない転送元のデータが上書きされるおそれがあります。そのため、高いアドレスから順に転送します。
具体的には、アドレス1004から1006へ転送を始め、アドレスを降順にたどって4語を転送します。したがって、転送元の開始アドレスは1004、転送先の開始アドレスは1006、方向フラグは降順を表す1、転送語数は4です。これに該当するのはエです。
解法ステップ
-
転送元と転送先の範囲を確認します。
転送元は1001~1004、転送先は1003~1006です。1003~1004の範囲が重なっています。 -
上書きの危険がある方向を考えます。
転送先は転送元より高いアドレス側にあります。昇順に転送すると、転送先への書込みが、後で読み取る転送元のデータを壊す可能性があります。 -
安全な転送方向を決めます。
高いアドレス側から低いアドレス側へ、つまり降順に転送します。 -
パラメタを対応付けます。
降順の転送では、開始位置は転送元・転送先それぞれの範囲の末尾です。よって、転送元は1004、転送先は1006、方向フラグは1、転送語数は4です。
選択肢別の誤答解説
- ア:開始アドレスは転送元1001、転送先1003で合っていますが、方向フラグが0なので昇順です。重複範囲で先に書き込んだデータが、後続の転送元データを上書きするおそれがあります。
- イ:方向フラグは1で降順ですが、開始アドレスが1001と1003になっています。降順で転送するには、範囲の末尾である1004と1006から始める必要があります。
- ウ:開始アドレスは1004と1006で合っていますが、方向フラグが0なので昇順です。開始位置と転送方向が整合していません。
- エ:転送範囲の末尾から開始し、方向フラグ1で降順に4語転送します。重複による上書きを防げる組合せです。
よくある誤解
- 開始アドレスは常に範囲の先頭だと思う
降順に転送する場合は、範囲の末尾を開始アドレスにします。 - 転送元と転送先が重なっていても、どちら向きでも同じだと思う
重複している場合、転送方向によっては、書込みが未転送データを上書きします。 - 方向フラグの0と1をアドレスの大小と結び付けて覚える
この問題では、0が昇順、1が降順です。問題文で指定された意味を確認してください。
補足コラム
転送元と転送先が重なるときは、上書きが起きない方向を選ぶことが重要です。今回のように転送先が転送元より高いアドレス側にある場合は、高いアドレスから転送します。反対に、転送先が低いアドレス側にある場合は、低いアドレスから転送すると安全です。
この考え方は、重複するメモリ領域を安全にコピーする処理にも使われています。
FAQ
Q. なぜ昇順で転送するとデータが壊れるのですか?
A. 1001から1003へ転送すると、転送先の1003が上書きされます。その後、元の1003にあったデータを読み出そうとしても、すでに転送元の1001の内容に置き換わっているためです。
A. 1001から1003へ転送すると、転送先の1003が上書きされます。その後、元の1003にあったデータを読み出そうとしても、すでに転送元の1001の内容に置き換わっているためです。
Q. 降順の場合、なぜ1004から始めるのですか?
A. 転送範囲の末尾から処理するためです。転送元の末尾が1004、転送先の末尾が1006なので、この2つを開始アドレスにします。
A. 転送範囲の末尾から処理するためです。転送元の末尾が1004、転送先の末尾が1006なので、この2つを開始アドレスにします。
関連キーワード: ブロック転送、重複領域、転送方向、アドレス、メモリコピー

\ せっかくなら /
エンベデッドシステムスペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

