同一メモリ空間で,転送元の開始アドレス,転送先の開始アドレス,方向フラグ及び転送語数をパラメータとして指定することによって,データをブロック転送できる機能をもつCPUがある。
図のようにアドレス1001から1004のデータをアドレス1003から1006に転送するとき,指定するパラメータとして適切なものはどれか。
ここで,転送は開始アドレスから1語ずつ行われ,方向フラグに0を指定するとアドレスの昇順に,1を指定するとアドレスの降順に転送を行うものとする。
正答4
解説
正解は4です。
図では、アドレス1001〜1004のデータを、2語ずれたアドレス1003〜1006へ転送しています。
転送元と転送先の範囲は、1003と1004の部分で重なっています。
重なりがある場合は、まだ読み出していないデータを先に上書きしない順序で転送する必要があります。
【処理の流れ】
昇順で転送すると、まず1001の内容が1003に書き込まれます。
この時点で、まだ転送していない元の1003の内容が失われてしまいます。
降順で転送すると、まず1004の内容を1006へ、次に1003の内容を1005へ書き込みます。
その後に1002を1004へ、1001を1003へ書き込むので、上書き前に必ず読み出せます。
したがって、転送元1004、転送先1006、方向フラグ1(降順)、転送語数4を指定します。
【選択肢別解説】
1:× 1001から昇順に転送すると、1003と1004の元データを読む前に上書きしてしまい、正しく転送できません。
2:× 開始アドレス1001から降順に転送すると、1001、1000、999…と図とは逆の範囲を転送してしまいます。
3:× 開始アドレス1004から昇順に転送すると、1004〜1007の範囲を1006〜1009へ転送することになり、図の範囲と異なります。
4:○ 1004から降順に1006へ転送すれば、重なった領域を上書きする前に読み出せるので、図のとおりに転送できます。
【ポイント】
転送先が転送元より大きいアドレスで重なる場合は、末尾から降順に転送します。
C言語のmemmove関数も、同じ考え方で重なりのある領域を安全に複写しています。