平成24年度 春期 午前Ⅱ 問2
プロセッサ
方向フラグに関する問題
同一メモリ上で転送するとき,転送元の開始アドレス,転送先の開始アドレス,方向フラグ及び転送語数をパラメタとして指定することでブロック転送ができるCPUがある。図のようにアドレス1001から1004の内容をアドレス1003から1006に転送するとき,パラメタとして適切なものはどれか。ここで,転送は開始アドレスから1語ずつ行われ,方向フラグに0を指定するとアドレスの昇順に,1を指定するとアドレスの降順に転送を行うものとする。
ブロック転送の図(原典は図。書き写した内容):
実行前: アドレス1000〜1007のうち,1001〜1004が転送対象(網掛け) 実行後: アドレス1000〜1007のうち,1003〜1006が転送結果(網掛け) 矢印: 実行前の1001〜1004 → 実行後の1003〜1006
選択肢は原典では転送元の開始アドレス・転送先の開始アドレス・方向フラグ・転送語数の表。
- ア転送元の開始アドレス:1001 / 転送先の開始アドレス:1003 / 方向フラグ:0 / 転送語数:4
- イ転送元の開始アドレス:1001 / 転送先の開始アドレス:1003 / 方向フラグ:1 / 転送語数:4
- ウ転送元の開始アドレス:1004 / 転送先の開始アドレス:1006 / 方向フラグ:0 / 転送語数:4
- エ転送元の開始アドレス:1004 / 転送先の開始アドレス:1006 / 方向フラグ:1 / 転送語数:4
答えと解説を見る
✓ これが正解エ転送元の開始アドレス:1004 / 転送先の開始アドレス:1006 / 方向フラグ:1 / 転送語数:4
解説
重なる範囲の転送は、末尾の1004から降順に送れば壊れません。
転送元と転送先のアドレス範囲が重なるときは、まだ読んでいない転送元を先に上書きしない順序を選ぶのが軸です。転送元は1001〜1004、転送先は1003〜1006で、1003と1004が重なっています。昇順で1001から送ると、1001の内容が1003へ書かれた時点で、まだ送っていない1003の元の内容が消えてしまいます。そこで末尾から送ります。転送元の開始を1004、転送先の開始を1006、方向フラグを1(降順)、転送語数を4とすると、1004→1006、1003→1005、1002→1004、1001→1003の順に進み、どれも上書きされる前に読み出されます。転送先が後ろへずれる重なりは後ろから送る、と覚えましょう。
ほかの選択肢はなぜ違うのか
- ア転送元の開始アドレス:1001 / 転送…:昇順で1001から送ると、1001→1003、1002→1004と進んだ時点で1003と1004の元の内容が上書きされています。続く1003→1005、1004→1006では書き換わった値を送ってしまい、正しく転送できません。
- イ転送元の開始アドレス:1001 / 転送…:開始アドレスを1001と1003にしたまま降順を指定すると、1001→1003、1000→1002、999→1001、998→1000と進みます。転送元が1001〜1004の範囲から外れてしまい、目的の4語を送れません。
- ウ転送元の開始アドレス:1004 / 転送…:開始アドレスを1004と1006にしたまま昇順を指定すると、1004→1006、1005→1007、1006→1008、1007→1009と進みます。転送元も転送先も目的の範囲から後ろへずれ、正しい転送になりません。
出典:平成24年度 春期 エンベデッドシステムスペシャリスト試験 午前Ⅱ 問2
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)