前へ | 次へ | 目次 | 索引 |
/CHECK=UNDERFLOW 修飾子または /PARALLEL 修飾子を使用してコンパイルしたプログラムをデバッグする場合には,次の例に示すようなメッセージが表示されます。
DBG> RUN FORMS Language: FORTRAN, Module: FORMS Type GO to reach main program DBG> |
"Type GO to reach MAIN program" というメッセージは,メイン・プログラムを開始する前に実行が中断されるため,デバッガの制御のもとで初期化コードを実行できることを示します。GO コマンドを入力すると,メイン・プログラムの先頭に設定されます。その時点で,GO コマンドを入力すると,他の Fortran プログラムの場合と同様に,プログラムの実行を開始できます。
C.11 MACRO-32
次の節では,デバッガによる MACRO-32 のサポートについて説明します。
C.11.1 言語式の演算子
MACRO-32 言語には,高級言語の式と同じ意味での式というものはありません。受け入れられるのはアセンブリ時の式と,限られた数の演算子だけです。デバッグ時に MACRO-32 のプログラミングで,他の言語の場合と同じくらい自由に式を使用できるようにするため,デバッガは,MACRO-32 自体には含まれていない多数の演算子を MACRO-32 の言語式の中で受け入れるようになっています。特に,BLISS 以後にモデル化された比較演算子とブール演算子はすべて受け入れます。間接参照演算子と通常の算術演算子も受け入れられます。
種類 | シンボル | 機能 |
---|---|---|
接頭辞 | @ | 間接参照 |
接頭辞 | . | 間接参照 |
接頭辞 | + | 単項正符号 |
接頭辞 | - | 単項負符号(否定) |
挿入辞 | + | 加算 |
挿入辞 | - | 減算 |
挿入辞 | * | 乗算 |
挿入辞 | / | 除算 |
挿入辞 | MOD | 剰余 |
挿入辞 | @ | 左シフト |
挿入辞 | EQL | 等値 |
挿入辞 | EQLU | 等値 |
挿入辞 | NEQ | 不等 |
挿入辞 | NEQU | 不等 |
挿入辞 | GTR | 大なり |
挿入辞 | GTRU | 大なり符号なし |
挿入辞 | GEQ | 以上 |
挿入辞 | GEQU | 以上符号なし |
挿入辞 | LSS | 小なり |
挿入辞 | LSSU | 小なり符号なし |
挿入辞 | LEQ | 以下 |
挿入辞 | LEQU | 以下符号なし |
接頭辞 | NOT | ビット単位のNOT |
挿入辞 | AND | ビット単位のAND |
挿入辞 | OR | ビット単位のOR |
挿入辞 | XOR | ビット単位の排他的論理和 |
挿入辞 | EQV | ビット単位の同値 |
サポートされている,MACRO-32 の言語式とアドレス式の構造を次に示します。
シンボル | 構造 |
---|---|
[ ] | 添字指定 |
<p,s,e> | BLISS同様のビットフィールドの選択 |
MACRO-32 アセンブラが作成する DST 情報では,記憶域を割り当てるアセンブラ指示文の前にあるラベルは,そのラベルが変数名である配列変数として扱われます。その結果,このようなデータを検査または操作するときに,高級言語の配列の構文を使用することができます。
次の MACRO-32 ソース・コードの例では,4 個のワードに格納されている 16 進数のデータをLAB4 ラベルで指定しています。
LAB4: .WORD ^X3F,5[2],^X3C |
デバッガは LAB4 を配列変数として処理します。たとえば次のコマンドは,各要素(ワード)に格納されている値を表示します。
DBG> EXAMINE LAB4 .MAIN.\MAIN\LAB4 [0]: 003F [1]: 0005 [2]: 0005 [3]: 003C |
次のコマンドは,4 番目のワードに格納されている値を表示します。1 番目のワードは要素"0" で表されます。
DBG> EXAMINE LAB4[3] .MAIN.\MAIN\LAB4[3]: 03C |
MACRO-32 は,データ型をラベル名にバイトします。バインドは,ラベル定義に続くアセンブラ指示文に従って行なわれます。サポートされている MACRO-32 の指示文を次に示します。
MACRO-32 の指示文 | VMS のデータ型名 |
---|---|
.BYTE | バイト符号なし(BU) |
.WORD | ワード符号なし(WU) |
.LONG | ロングワード符号なし(LU) |
.SIGNED_BYTE | バイト整数(B) |
.SIGNED_WORD | ワード整数(W) |
.LONG | ロングワード整数(L) |
.QUAD | クォドワード整数(Q) |
.F_FLOATING | F 浮動小数点数(F) |
.D_FLOATING | D 浮動小数点数(D) |
.G_FLOATING | G 浮動小数点数(G) |
.H_FLOATING | H 浮動小数点数(H)(VAX 固有) |
(該当なし) | パック 10 進数(P) |
C.11.4 MACRO-32 コンパイラ(AMACRO)(Alpha 専用)
MACRO-32 で記述したアプリケーションを Alpha システムに移植する場合は,MACRO-32 コンパイラ(AMACRO)を使用します。MACRO-32 でコンパイルされたコードをデバッグするためのデバッグ・セッションは,アセンブルされたコードの場合に似ていますが,本項で説明するような重要な相違もあります。これらのアプリケーションを移植する場合の説明については,『 Porting VAX MACRO Code from OpenVMS VAX to OpenVMS Alpha 』を参照してください。
C.11.4.1 コードの再配置
大きな相違は,コードがコンパイルされているという事実です。VAX システムでは,MACRO-32 の各命令は単一のマシン命令です。Alpha システムでは,MACRO-32 の各命令は,Alpha の複数のマシン命令へとコンパイルされることがあります。この相違によって大きな副作用が生じます。それは,コンパイル・コマンドで /NOOPTIMIZE を指定しない場合,コードの再配置と再スケジューリングが行われるということです。コードのデバッグが終わってから,/NOOPTIMIZE を指定しないでリコンパイルすることにより性能を改善できます。
C.11.4.2 シンボリック変数
コンパイルされたコードをデバッグする場合とアセンブルされたコードをデバッグする場合とには,他にも大きな相違があります。それは,MACRO-32 にとっての新しいコンセプトである,ルーチンの引数を調べるためのシンボリック変数の定義です。VAX システムでは,ルーチンをデバッグしていて,引数をチェックしたくなったら,通常は,次のような入力を行うと考えられます。
DBG> EXAMINE @AP ; to see the argument count DBG> EXAMINE @AP+4 ; to examine the first arg |
また,次のような入力をすることも考えられます。
DBG> EXAMINE @AP ; to see arg count DBG> EXAMINE .+4:.+20 ; to see first 5 args |
Alpha システムでは,引数はメモリ内のベクタには常駐していません。これが VAX システムとは異なる点です。さらにはまた,Alpha システムには AP レジスタがありません。MACRO でコンパイルしたコードをデバッグしているときに,EXAMINE @AP と入力すると,デバッグは,AP は未定義シンボルであるというメッセージを発行します。
コンパイルしたコードでは,引数は,次に述べる項目を組み合せたものとして常駐することができます。
作成されたコードを読み出して引数を検索することをコンパイラがユーザに要求することはありません。コンパイラには,引数の正しい位置を指し示す $ARGn シンボルがあります。$ARG0 は,VAX システムの @AP+0 と同じもの,つまり引数の個数です。たとえば $ARG1 は最初の引数,$ARG2 は 2 番目の引数です。これらの引数は,CALL_ENTRY 指示文および JSB_ENTRY 指示文で定義されますが,EXCEPTION_ENTRY 指示文では定義されません。
C.11.4.3 $ARGn シンボルを使用しない引数検索
ユーザのコードで,コンパイラが $ARGn シンボルを作成しない追加の引数が使用されることがあります。.CALL_ENTRY ルーチンに対して定義される $ARGn シンボルの個数は,コンパイラが自動検出または MAX_ARGS によって検出した最大値または 16 のどちらか小さい方です。.JSB_ENTRY ルーチンの場合,引数は呼び出す側のスタック・フレーム内のホーム・ポジションにあり,コンパイラは実際の数を検出できないので,$ARGn シンボルを常に 8 個作成します。
ほとんどの場合,追加の引数は容易に見つけられますが,そうでない場合もあります。
C.11.4.4 検索しやすい引数
次の場合は,追加の引数は容易に見つけられます。
たとえば,次のようにすれば JSB ルーチン内の 8 番目の引数より先にある引数を調べることができます。この場合,引数リストのホーム・ポジションへのセットは呼び出す側で行うことが必要です。
DBG> EX $ARG8 ; highest defined $ARGn . . . DBG> EX .+4 ; next arg is in next longword . . . DBG> EX .+4 ; and so on |
この例では,引数リストをホーム・ポジションにセットするときに呼び出す側が少なくとも 10 個の引数を検出したと想定しています。
引数のホーム・ポジションをセットしなかったルーチンの最後の $ARGn シンボルより先の引数を見つけるには,上記の例で EX .+4 を EX .+8 で置き換えた後,例に示すとおりに実行します。
C.11.4.5 検出しにくい引数
次の場合は,追加の引数を見つけるのは容易ではありません。
これらのケースで追加の引数を見つける方法は,コンパイルされたマシン・コードを調べ,引数がどこに常駐しているかを判断することです。チェックしたい引数の最大値に対して MAX_ARGS が正しく指定されていれば,どちらの問題も解消します。
C.11.4.6 浮動小数点数データ付きのコードのデバッグ
Alpha システムで浮動小数点数データ付きの,コンパイルされた MACRO-32 コードをデバッグする際の重要な情報を次に説明します。
Alpha システムに浮動小数点演算用レジスタが 1 セットあるとしても,浮動小数点演算を含む,コンパイルされた MACRO-32 コードでこれらのレジスタを使用することはない。使用されるのは Alpha 整数レジスタだけである。
コンパイルされた MACRO-32 コードでの浮動小数点数演算は,コンパイラの外部で動作するエミュレーション・ルーチンで実行される。したがって,たとえば R7 に MACRO-32 浮動小数点数演算を実行しても,Alpha の浮動小数点数レジスタ 7 には影響はない。
次に例を示します。
EXAMINE/G_FLOAT R4 |
この例では,VAX の場合と異なるり,R4 と R5 の下位ロングワードは値の作成には使用されない。その代わり,R4 の内容のクォドワードが使用される。
コンパイラが D_FLOAT 演算および G_FLOAT 演算用に作成したコードは,2 つの連続するレジスタの下位ロングワードのデータの VAX 形式を保持している。したがって,これらの 2 つのレジスタのどちらかに EXAMINE/G_FLOAT を使用しても,真の浮動小数点数値を得ることはできない。また,これらのレジスタのひとつに DEPOSIT/G_GLOAT を実行しても必要な結果は得られない。ただし,そのような値を半分にしたものをマニュアルで結合することはできる。例えば,次の命令を実行したとする。
MOVG DATA, R6 |
その後,現在 R6 と R7 にある G_FLOAT 値を次のシーケンスで読み出すことができる。
DBG> EX R6 .MAIN.\%LINE 100\%R6: 0FFFFFFFF D8E640D1 DBG> EX R7 .MAIN.\%LINE 100\%R7: 00000000 2F1B24DD DBG> DEP R0 = 2F1B24DDD8E640D1 DBG> EX/G_FLOAT R0 .MAIN.\%LINE 100\%R0: 4568.89900000000 |
C.11.4.7 パック 10 進数データ付きのコードのデバッグ
Alpha システムでパック 10 進数データ付きの,コンパイルされた MACRO-32 コードをデバッグする際の重要な情報を次に説明します。
以下の各節では,デバッガによる MACRO-64 のサポートについて説明します。
前へ | 次へ | 目次 | 索引 |