アセンブリ言語(System/360)の例
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2018/10/23 06:34 UTC 版)
「ループ展開」の記事における「アセンブリ言語(System/360)の例」の解説
* 配列などを指すよう全レジスタを初期化しておく(R14はリターンアドレス) LM R15,R2,INIT load R15= '16'、R0= 配列要素数、R1--> FROM配列、R2--> TO配列LOOP EQU * SR R15,R0 配列要素数を16から引く BNP ALL n > 16 なら全命令列を実行し、繰り返す* MVC命令列の先頭からのオフセットを計算し、展開されたMVCループの所定の位置に無条件ジャンプする MH R15,=AL2(ILEN) MVC命令の長さ(この例では6)をかける B ALL(R15) インデックス付き分岐命令(その位置からMVC命令を実行)* 転送テーブル - 1つめが最大オフセットであり、この例では X'F00'ALL MVC 15*256(100,R2),15*256(R1) * 16番目のエントリの100バイトをFROMからTOに転送ILEN EQU *-ALL MVC命令の長さ。この例では6 MVC 14*256(100,R2),14*256(R1) * MVC 13*256(100,R2),13*256(R1) * MVC 12*256(100,R2),12*256(R1) * これら16個の文字転送命令 (MVC) はベース+オフセットのアドレッシングであり MVC 11*256(100,R2),11*256(R1) * オフセットは配列の要素長 (256) ずつ減っている。 MVC 10*256(100,R2),10*256(R1) * System/360では命令で指定できるオフセットの最大値は X'FFF' であり MVC 09*256(100,R2),09*256(R1) * それを越えない範囲で展開可能な最大が16要素ということになる。 MVC 08*256(100,R2),08*256(R1) * オフセットの大きい方から転送するので、先頭の要素が最後に転送される。 MVC 07*256(100,R2),07*256(R1) * MVC 06*256(100,R2),06*256(R1) * MVC 05*256(100,R2),05*256(R1) * MVC 04*256(100,R2),04*256(R1) * MVC 03*256(100,R2),03*256(R1) * MVC 02*256(100,R2),02*256(R1) * MVC 01*256(100,R2),01*256(R1) 2番目の要素の100バイトを転送 MVC 00*256(100,R2),00*256(R1) 1番目の要素の100バイトを転送* S R0,MAXM1 残り要素数を引く BNPR R14 全部転送し終えたので、R14のリターンアドレスで呼び出し元に復帰 AH R1,=AL2(16*256) FROMへのポインタを1反復ぶんだけずらす AH R2,=AL2(16*256) TOへのポインタを1反復ぶんだけずらす L R15,MAXM1 R15をMVC命令数 (16) に再設定する(計算で壊れているため) B LOOP ループの先頭に戻る** ----- 定数と変数の定義(引数として渡すこともできる) --------------------------------- *INIT DS 0A LM命令で事前ロードされる4つのアドレス(ポインタ)MAXM1 DC A(16) MVC命令数N DC A(50) 配列の要素数(変数であり、変更可能) DC A(FROM) 配列1の先頭アドレス(ポインタ) DC A(TO) 配列2の先頭アドレス(ポインタ)* ----- 配列の定義(動的に確保することも可能) -------------------------------------------------- *FROM DS 50CL256 256バイト×50エントリの配列TO DS 50CL256 256バイト×50エントリの配列 この例を通常の50回反復するループで記述すると202命令を必要とするが、このように動的コードにすると約89命令で済む(約56%のコード削減)。配列が2要素しかない場合でも、単純なループ展開と同程度の命令数となる。バイナリサイズの増大は約108バイトほどであり、配列の要素数が数千であっても対応可能である。この場合はMVC命令の反復を展開しただけだが、複数命令の場合も同様の技法が適用可能である。例えば、この例で各要素の先頭100バイトをコピーした後、残りの部分をヌル文字でクリアしたい場合、'XC xx*256+100(156,R1),xx*256+100(R2)' という命令を各MVC命令の後に追加すればよい('xx' は直前のMVC命令と同じ値にする。ILENの位置に注意)。 4つまたは5つの引数を持つマクロで上記コードをインライン展開することも可能だし、サブルーチン化することも可能である。
※この「アセンブリ言語(System/360)の例」の解説は、「ループ展開」の解説の一部です。
「アセンブリ言語(System/360)の例」を含む「ループ展開」の記事については、「ループ展開」の概要を参照ください。
- アセンブリ言語の例のページへのリンク