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


選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
重なり合う領域のブロック転送【午前2解説】
正解の理由
転送元のアドレス範囲は1001~1004、転送先の範囲は1003~1006です。両範囲は1003、1004で重なっており、転送先のほうが高位アドレス側にあります。
この場合、アドレスの昇順に転送すると、転送先に書き込んだ値が、まだ読み込んでいない転送元の値を上書きするおそれがあります。上書きを防ぐには、高位アドレス側から低位アドレス側へ転送します。
したがって、転送元の開始アドレスを1004、転送先の開始アドレスを1006とし、降順を指定する方向フラグ1、転送語数4を指定するエが適切です。
解法ステップ
-
転送範囲を確認します。
転送元は1001~1004、転送先は1003~1006です。 -
範囲の重なりと位置関係を確認します。
範囲は重なっており、転送先は転送元より高位アドレス側にずれています。 -
上書きを避ける転送方向を選びます。
高位アドレス側から転送すれば、まだ読み込んでいない転送元のデータを壊しません。 -
パラメタを決めます。
最初に処理するのは転送元の末尾1004から転送先の末尾1006への転送です。降順を示す方向フラグは1、転送語数は4です。
選択肢別の誤答解説
- ア:開始アドレスと転送語数は合っていますが、方向フラグが0なので昇順です。1001→1003と書き込むと、次に読み込む予定の転送元アドレス1003を上書きしてしまいます。
- イ:方向フラグは1ですが、開始アドレスが1001と1003です。降順で処理するには、範囲の末尾である1004と1006から開始する必要があります。
- ウ:開始アドレスは1004と1006ですが、方向フラグが0なので昇順です。開始位置からアドレスを増やしていくと、指定された転送範囲を正しく処理できません。
- エ:転送元1004、転送先1006から始め、方向フラグ1で降順に4語を転送します。上書きを避けながら、1001~1004の内容を1003~1006へ移せます。
よくある誤解
- 開始アドレスを常に範囲の先頭にする
降順転送では、範囲の末尾から処理するため、開始アドレスは高位側になります。 - 方向フラグの0と1を逆に覚える
この問題では、0が昇順、1が降順です。問題文の定義を確認してください。 - 重なる範囲でも転送順序は関係ないと考える
同一メモリ内の転送では、書き込みが後続の読み込み元を上書きすることがあるため、順序が重要です。
補足コラム
今回の転送順序は、次のとおりです。
高位アドレス側から先にコピーすることで、転送元のデータを読み込む前に上書きする事態を防げます。重複領域を安全に移動する処理では、コピー方向の選択が重要です。
FAQ
なぜ1001から順番にコピーしてはいけないのですか?
最初に1001の内容を1003へ書き込むと、元の1003の内容が失われます。1003はまだ転送元として読み込む必要があるため、昇順では正しく転送できません。
最初に1001の内容を1003へ書き込むと、元の1003の内容が失われます。1003はまだ転送元として読み込む必要があるため、昇順では正しく転送できません。
転送語数4は、どの範囲を表していますか?
転送元の1001~1004、転送先の1003~1006という、それぞれ4語分の範囲を表します。
転送元の1001~1004、転送先の1003~1006という、それぞれ4語分の範囲を表します。
転送先が転送元より低位アドレス側にある場合はどう考えますか?
範囲が重なる場合、一般に低位アドレス側へずらす転送では、低位アドレス側から高位アドレス側へ転送することで、未読み込みのデータを上書きしにくくなります。
範囲が重なる場合、一般に低位アドレス側へずらす転送では、低位アドレス側から高位アドレス側へ転送することで、未読み込みのデータを上書きしにくくなります。
関連キーワード: ブロック転送、メモリ転送、転送方向、アドレスの昇順、アドレスの降順、重複領域のコピー

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

