MVC命令
MVC命令
機能と構文
MVC(Move)は、メモリー内でのデータの移動を行う命令です。A番地にあるバイト・データをB番地に移します(写します)。命令の名前はMoveですが、転送元のメモリー内容はそのままなので、実際の動作は移動ではなく複写(Copy)です。
MVCは、CPU命令の中でも非常によく使われる命令の1つです。機能は単純ですが、利用範囲は広いので、最初に覚えてしまいたい命令の1つでもあります。
MVC d1(l,b1),d2(b2)
命令の機能としては、第2オペランドd2(b2)で示される送り側領域のデータが、第1オペランドd1(l,b1)で示される受け側領域に転送されます。転送後も送り側領域のデータはそのまま残ります。転送される長さは最大256バイトで第1オペランドで指定します。形としては受け側領域の長さを指定することになります。
: BREAK01 DS 0H MVC AA,BB 領域BBから領域AAへのデータ・コピー 長さは領域AAの長さ分となる BREAK02 DS 0H XC AA,AA LA R2,AA MVC 0(100,R2),BB 領域BBからGR2が示す領域へ100バイト分の データ・コピー BREAK03 DS 0H : AA DC XL200'00' BB DC 6C'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
転送オペレーションの方向は左から右に向かって行われます。言い換えると、第2オペランドが示す送り側領域の低位アドレスから高位アドレスに向かって1バイト取り出されて受け側領域に格納された後、次のバイトが処理されます。受け側領域より送り側領域の長さが短い場合、送り側領域の後続の領域の内容が続けて転送されます。送り側領域の後ろに有効な仮想記憶が存在しないと、MVC命令はS0C4でABENDしてしまいます。この場合、データは1バイトも転送されません。送り側領域の途中のデータ(有効な領域)まで転送されるようなことはありません。
オペランドの重複
オペランドの重複とは送り側領域と受け側領域が重なっていることを指します。通常では、アドレスを誤らない限り送り側と受け側の領域が重なることはありません。しかしMVC命令はオペランド重複を認めており、エラーにならずに転送オペレーションが行われます。MVC命令では送り側領域の内容は変更されない、と述べましたが、オペランド重複の場合は例外です。元のデータはMVC命令による転送バイトで上書きされることになります。
このような動作特性を利用して、領域のヌル・クリアーや空白文字の埋め込みなどの処理に応用されます。
: BREAK03 DS 0H MVI CC,C' ' SET BLANK CHARACTER MVC CC+1(L'CC-1),CC PAD BY BLANK CHARACTER : CC DC XL256'00'
命令とページフォールト
考えたら当然のことなのですが、MVCのように仮想アドレスを扱う命令は、途中で割り込み可能な命令です。第一オペランドでも第二オペランドでも参照したアドレスがページアウトされていた場合、ページフォールトが起こりページングメカニズムが働きます。
次にディスパッチされるタイミングはOSの動き次第です。
従って、MVC命令の実行中に他のタスク、SRBが動くことはあります。
通常心配することはありませんが、タイミングを気にするプログラムを作る場合、命令によっては途中で割り込みがかかることはあるということは考慮しておいてください。