メモリ上のデータ転送|科目A-1(応用情報技術者) 令和6年 春期午前試験 問8
出典:令和6年春期 午前 問8
分野:コンピュータ構成要素 / プロセッサ
同一メモリ空間で,転送元の開始アドレス,転送先の開始アドレス,方向フラグ及び転送語数をパラメータとして指定することで,データをブロック転送できる機能をもつCPUがある。図のようにアドレス 1001 から 1004 の内容をアドレス 1003 から 1006 に転送する場合,パラメータとして適切なものはどれか。ここで,転送は開始アドレスから1語ずつ行われ,方向フラグに0を指定するとアドレスの昇順に,1を指定するとアドレスの降順に転送を行うものとする。
| 転送元の開始アドレス | 転送先の開始アドレス | 方向フラグ | 転送語数 | |
| ア | 1001 | 1003 | 0 | 4 |
| イ | 1001 | 1003 | 1 | 4 |
| ウ | 1004 | 1006 | 0 | 4 |
| エ | 1004 | 1006 | 1 | 4 |
TSUNAGARU-ADVICE
まず押さえたいこと
転送元と転送先のアドレス範囲が重なっている場合は、コピー途中で元データを上書きしない方向から転送する必要があります。今回のように転送先が転送元より後ろのアドレスにある場合は、後ろ側のデータから順にコピーするのが基本です。
迷ったときの判断軸
昇順で転送すると、先に書き込んだ転送先が後続の転送元と重なり、元の値が失われる場合があります。そこで、転送元・転送先とも末尾側のアドレスを開始位置にして、アドレスを減らしながら転送すると安全です。転送語数は、コピーするデータの個数から判断します。
科目Bにつなげるために
特にプロフェッショナルデジタルスキル(システム)試験合格を目指す方は、この考え方をメモリコピー、アドレス範囲の重なり、コピー方向と結び付けて理解しましょう。低水準プログラミングやOS、組込み処理では、重複領域のコピーでデータ破壊を防ぐための重要な考え方になります。
この問題では、転送元と転送先の領域が一部重なっている点がポイントです。元のデータはアドレス1001~1004にあり、それを1003~1006へ移します。
もしアドレスの昇順に転送すると、最初に1001の内容を1003へ書き込んだ時点で、本来1003にあった転送前のデータが上書きされてしまいます。その後1003の内容を1005へ転送すると、既に書き換えられたデータを転送することになり、正しくコピーできません。
したがって、後ろ側から順番に転送する必要があります。まず1004 → 1006、次に1003 → 1005、1002 → 1004、最後に1001 → 1003の順で処理します。
転送元の開始アドレスは1004、転送先の開始アドレスは1006となります。また、アドレスを1ずつ減らして転送するので方向フラグは1、1001~1004の4語を転送するので転送語数は4です。
したがって、エが適切です。
❌他選択肢が誤りの理由ア:転送元の開始アドレス1001,転送先の開始アドレス1003,方向フラグ0,転送語数4
⇒方向フラグ0では1001 → 1003から昇順に転送します。すると、元の1003の内容が最初の転送によって上書きされ、その後の転送で誤ったデータが使われるため適切ではありません。
イ:転送元の開始アドレス1001,転送先の開始アドレス1003,方向フラグ1,転送語数4
⇒方向フラグ1は降順なので、開始アドレス1001から始めると1001、1000、999……という方向へ進んでしまいます。転送したい1004~1001を逆順に処理するには、開始位置を1004にする必要があります。
ウ:転送元の開始アドレス1004,転送先の開始アドレス1006,方向フラグ0,転送語数4
⇒開始アドレスは後ろ側になっていますが、方向フラグ0ではアドレスが増加するため、1004、1005、1006……を転送することになります。転送元である1001~1004を処理できないので適切ではありません。