1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- R0 EQU 0 R1 EQU 1 R2 EQU 2 : R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 RA EQU A RA = R10 RB EQU B RB = R11 RC EQU C RC = R12 RD EQU D RD = R13 RE EQU E RE = R14 RF EQU F RF = R15 GR0 EQU 0 GENERAL PURPOSE REGISTER AR0 EQU 0 ACCESS REGISTER FPR0 EQU 0 FLOATING POINT REGISTER RBASE EQU 12 1ST BASE REGISTER RSAVEA EQU 13 SAVEAREA REGISTER |
多くのプログラマーは、機械(CPU)命令のオペランドで指定するレジスター番号を単なる10進数ではなく Rn のようなシンボル名で指定します。これは、即値としての数字とレジスター番号を区別しやすくする工夫の1つです。たいていは頭にRを付けてR0,R1,R2,…,R9,R10,R11,…と書くことが多いですが、10以降のレジスター番号を16進数で RA,RB,RC,RD,RE,RF と書くプログラマーもいます。筆者も後者ですが、ISV在籍時代に担当していたプロダクトのコードがそのように書かれていたのでそのまま慣れたというものです。レジスター番号の16進数表記は一見わかりにくいと思われるかも知れませんが、番号が10~15になっても桁数が変わらないので後からレジスター番号を変える(例えば、 LA R1,WORKAREA を、LA R15,WORKAREA に変える)ような場合でも、コーディング時にレジスター番号の桁数が変わることによる挿入や削除をしなくて済むという利点は感じました。
汎用レジスターだけを使うプログラムでは Rn あるいは Rx 表記でいいのですが、浮動小数点命令やアクセスレジスターを使うプログラムではレジスター種別をわかりやすくするため、汎用レジスターなら GRn あるいは GPRn、浮動小数点レジスターは FPRn、アクセスレジスターは ARnと表記したりします。制御レジスターなら CTLRnです。また、レジスターの使用目的でシンボル名を付けることもあります。GR13はレジスター保管域アドレスをポイントするのでRSAVEA、GR12をベースアドレスにするならRBASEのようにです。
レジスター番号は数字だけを直接書く、シンボル名で書くのどちらも自由です。単なる Rn 表記の番号ではなく用途に合わせたシンボル名でもかまいません。プログラマーのスタイルで決めてよいのですが、開発プロジェクトなどでレジスター表記の規約が定められているような場合はそれに従います。
R0~R15のレジスター番号表記を行うためには、ソース・コード内に上記のようなEQU命令による定義が必要ですが、MVS(z/OS)であればYREGSマクロを使用することでEQU定義に替えることができます。
1 2 3 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- YREGS , S/370 REGISTER EQUATES END , |
ソース・コードの最後尾(END命令の前)あるいは元々EQU命令を書いていた箇所に YREGS と書けば、YREGSマクロ内で記述されたレジスター番号0~15に対応するEQU定義命令が展開されます。(自分でR0~R15の16個分のEQU命令を書かなくてもYREGSと1行書くだけで済む)