日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部 : 概念と方法
第 1 章:Macro-32コードの移植の準備
第 2 章:MACROコンパイラのプラットフォームごとの動作
第 3 章:ソースに対する推奨される変更と必要な変更
第 4 章:移植したコードの性能改善
第 5 章:MACROの64ビット・アドレッシングのサポート
第 2 部:リファレンス・セクション
付録 A :MACROコンパイラの修飾子
付録 B :専用の指示文
付録 C :MACROコンパイラ・ビルトイン
付録 D :VAXからAlphaまたはI64への移植用のマクロ
付録 E :64ビット・アドレッシング用のマクロ
索引
PDF
OpenVMS ホーム
HP OpenVMS MACRO コンパイラポーティングおよびユーザーズ・ガイド

HP OpenVMS MACRO コンパイラ
ポーティングおよびユーザーズ・ガイド


目次 索引



コンパイラは以下のファイルを必要とします。

  • SYS$LIBRARY:STARLET.MLB
    これは,コンパイラ指示文が定義されたマクロ・ライブラリです。コードをコンパイルする際,コンパイラは自動的に STARLET.MLB のコンパイラ指示文の定義を確認します。

  • SYS$LIBRARY:STARLET.OLB
    これは,コンパイラが使用するエミュレーション・ルーチンとその他のルーチンが格納されているオブジェクト・ライブラリです。コードをリンクすると,リンカは STARLET.OLB とリンクして未定義のシンボルを解決します。

コンパイラ修飾子については, 付録 A を参照してください。

2.12.1 リスト・ファイルの行番号

リスト・ファイル内でのマクロ展開の行番号は, Xnn/mmm となります。ここで,Xnn はネストの深さを表し, mmm は最も外側のマクロからの相対行番号です。

例 2-1 に OpenVMS I64 のリスト・ファイルを示します。 OpenVMS Alpha のリスト・ファイルのソース部分は基本的に同じです。

例 2-1 OpenVMS I64のリスト・ファイルでの行番号の例
                      00000000       1 ; 
                      00000000       2 ; This is the Itanium (previously called "IA-64") version of 
                      00000000       3 ; ARCH_DEFS.MAR, which contains architectural definitions for 
                      00000000       4 ; compiling VMS sources for VAX, Alpha, and I64 systems. 
                      00000000       5 ; 
                      00000000       6 ; Note: VAX, VAXPAGE, and IA64 should be left undefined, 
                      00000000       7 ;       a lot of code checks for whether a symbol is 
                      00000000       8 ;       defined (e.g. .IF DF VAX) vs. whether the value 
                      00000000       9 ;       is of a expected value (e.g. .IF NE VAX). 
                      00000000      10 ; 
                      00000000      11 ;VAX   = 0   
                      00000000      12 ;EVAX  = 0 
                      00000000      13 ;ALPHA = 0 
00000001              00000000      14 IA64   = 1 
                      00000000      15 ; 
                      00000000      16 ;VAXPAGE = 0 
00000001              00000000      17 BIGPAGE  = 1 
                      00000000      18 ; 
00000020              00000000      19 ADDRESSBITS = 32 
                      00000000      20  .TITLE ug_ex_listing /line numbering in the listing file/ 
                      00000000      21 ; 
                      00000000      22  .MACRO test1 
                      00000000      23  clrl r1 
                      00000000      24  clrl r2 
                      00000000      25  tstl 48(sp)  ; generate uplevel stack error 
                      00000000      26  clrl r3 
                      00000000      27  .ENDM test1 
                      00000000      28  .MACRO test2 
                      00000000      29  clrl r4 
                      00000000      30  clrl r5 
                      00000000      31  test1 
                      00000000      32  clrl r6 
                      00000000      33  .ENDM test2 
                      00000000      34 
                      00000000      35 foo: .jsb_entry 
                      00000000      56  .show expansions 
                      00000000      57  clrl r0 
                      00000011      58  test2 
     1.......      
%IMAC-E-UPLEVSTK, (1) up-level stack reference in routine FOO 
 
         X01/001      00000002   clrl r4 
         X01/002      00000004   clrl r5 
         X01/003      00000006   test1 
         X02/004      00000006   clrl r1 
         X02/005      00000008   clrl r2 
         X02/006      0000000A   tstl 48(sp)  ; generate uplevel stack error 
         X02/007      0000000D   clrl r3 
         X02/008      0000000F   
         X01/009      0000000F   clrl r6 
         X01/010      00000011   
                      00000011      59  rsb 
                      00000012      60  .noshow expansions 
                      00000012      61 
                      00000012      62  .END 



2.13 デバッグ

コンパイラはデバッガを完全にサポートしています。コンパイルされた VAX MACRO コードのデバッグ・セッションは,アセンブルされた VAX MACRO コードのデバッグと同様です。ただし,ここで説明する重要な違いがいくつかあります。デバッグの詳しい説明については, OpenVMS Debugger Manual を参照してください。

2.13.1 コードの再配置

大きな違いの 1 つは,コードがアセンブルされるのではなくコンパイルされるという点です。 OpenVMS VAX システムでは, VAX MACRO のそれぞれの命令は単一の機械語命令でした。 OpenVMS Alpha システムや OpenVMS I64 システムでは, VAX MACRO のそれぞれの命令は多数の Alpha または Itanium の機械語命令にコンパイルされます。この違いの大きな副作用は,コンパイル・コマンドで /NOOPTIMIZE を指定しなかった場合のコードの再配置と再スケジューリングです。

デフォルトでは,いくつかの最適化が行われ,生成されたコードがソースの境界を超えて移動されます ( 第 1.2 節第 4.3 節 ,および 付録 A を参照)。ほとんどのコード・モジュールでは, /NOOPTIMIZE を指定してコンパイルすることでデバッグ作業が単純化されます。これを指定すると,再配置が行われなくなります。コードのデバッグを終えたら, /NOOPTIMIZE を指定せずに再コンパイルして性能を向上させることができます。

2.13.2 ルーチンの引数のシンボリック変数

コンパイルされたコードのデバッグとアセンブルされたコードのデバッグのもう 1 つの大きな違いは,VAX MACRO に対する新しい概念である,ルーチンの引数を調べるためのシンボリック変数の定義です。 OpenVMS 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 

OpenVMS Alpha システムと OpenVMS I64 システムでは,引数は OpenVMS VAX システムと異なりメモリ内のベクタにありません。さらに, OpenVMS Alpha システムと OpenVMS I64 システムには AP レジスタがありません。 VAX MACRO のコンパイルされたコードをデバッグする際に EXAMINE @AP と入力すると,デバッガから AP が未定義のシンボルであると報告されます。

コンパイルされたコードでは,引数は以下の場所の組み合わせに置かれています。

  • レジスタ

  • ルーチンのスタック・フレームより上のスタック中

  • 引数リストがホーミングされている場合 ( 第 2.4 節 を参照) や,レジスタ引数を保存する必要があるルーチンを呼び出している場合は,スタック・フレーム内。

生成されたコードを参照してどこに引数があるかを探す必要はありません。代わりに,引数の正しい位置を指している $ARGn シンボルが用意されています。 $ARG0 シンボルは,VAX システムでの @AP+0 と同じで引数の個数です。 $ARG1 シンボルは最初の引数で,$ARG2 が 2 番目の引数となり,以下同様です。これらのシンボルは CALL_ENTRY 指示文と JSB_ENTRY 指示文では定義されていますが,EXCEPTION_ENTRY 指示文では定義されていません。

2.13.3 $ARGn シンボルを使用せずに引数を見つける

コンパイラが $ARGn シンボルを生成しない追加の引数がコードの中にある場合があります。 .CALL_ENTRY ルーチンで定義される $ARGn シンボルの数は,コンパイラによって検出された最大数です (自動的に検出されるか,MAX_ARGS によって指定します)。 .JSB_ENTRY ルーチンでは,引数は呼び出し元のスタック・フレームにホーミングされ,コンパイラは実際の数を検出できないため,常に 8 個の $ARGn シンボルが作成されます。

ほとんどの場合,追加の引数を容易に見つけることができますが,見つけられない場合もあります。

以下の場合は追加の引数を容易に見つけることができます。

  • 引数リストがホーミングされておらず, $ARGn シンボルが OpenVMS Alpha では $ARG7 以降まで, OpenVMS I64 では $ARG9 以降まで定義されている場合。引数リストがホーミングされていない場合, OpenVMS Alpha では $ARG7 以降, OpenVMS I64 では $ARG9 以降の $ARGn シンボルは,スタック上のクォドワードとして渡されたパラメータのリストを常に指します。以降の引数は,最後に定義された $ARGn シンボルに続くクォドワードの中にあります。

  • 引数リストがホーミングされている場合で,コンパイラによって検出された最大数 (自動的に検出されるか, MAX_ARGS によって指定します) に等しいかそれよりも前の引数を調べたい場合。引数リストがホーミングされている場合, $ARGn シンボルは常にホーミングされた引数リストを指します。以降の引数は,最後に定義された $ARGn シンボルに続くロングワードの中にあります。

たとえば,次のようにして, 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 に置き換えます。

以下の場合は追加の引数を容易に見つけることができません。

  • 引数リストがホーミングされておらず, $ARGn シンボルが OpenVMS Alpha では $ARG6, OpenVMS I64 では $ARG8 までしか定義されていない場合。この場合,存在している $ARGn シンボルは,レジスタまたはスタック・フレーム中のクォドワードのどちらかを指します。どちらの場合でも,定義されている $ARGn シンボルの後ろのクォドワードを参照しても,以降の引数を調べることはできません。

  • 引数リストがホーミングされており,コンパイラが検出した数を超える引数を調べたい場合。 $ARGn シンボルは,ホーミングされた引数リストに格納されているロングワードを指します。コンパイラは検出できた数の引数だけをこのリストに移動します。ホーミングされた最後の引数の後ろのロングワードを調べると,さまざまな他のスタック・コンテキストを調べることになります。

これらの場合に追加の引数を探す唯一の方法は,コンパイルされた機械語コードを調べ,引数がある場所を確認することです。調べたい引数の最大数を MAX_ARGS に正しく指定すれば,これらの問題はどちらも解決できます。

2.13.4 OpenVMS I64 での VAX と Alpha のレジスタ名の使用

便宜上, OpenVMS I64 上の MACRO コンパイラではシンボル名 R0,R1,... R31 が定義されており, Alpha のこれらのレジスタの値が格納されている Itanium のレジスタを参照するようになっています。それでも,デバッガの名前 %R0,%R1,... %R31 を使用してマシンのネイティブな番号付けでレジスタを参照することができます。

2.13.5 パック 10 進数データを使用したコードのデバッグ

パック 10 進数データを使用した,コンパイルされた VAX MACRO コードを, OpenVMS Alpha システムまたは OpenVMS I64 システムでデバッグする際には,以下の情報を念頭に置いてください。

  • EXAMINE コマンドを使用して, .PACKED 指示文で宣言された場所を調べるときには,デバッガは自動的に値をパック 10 進数データ型として表示します。

  • パック 10 進数データを格納することができます。構文は VAX での構文と同じです。



2.13.6 浮動小数点データを使用したコードのデバッグ

浮動小数点データを使用した,コンパイルされた VAX MACRO コードを, OpenVMS Alpha システムまたは OpenVMS I64 システムでデバッグする際には,以下の情報を念頭に置いてください。

  • EXAMINE/FLOAT コマンドを使用して, Alpha または Itanium の整数レジスタの浮動小数点数値を調べることができます。
    OpenVMS Alpha システムと OpenVMS I64 システムでは浮動小数点演算用のレジスタ・セットがありますが,浮動小数点演算が含まれる,コンパイルされた VAX MACRO コードでは,これらのレジスタは使用されません。整数レジスタだけが使用されます。
    コンパイルされた VAX MACRO コードにおける浮動小数点演算は,コンパイラの外で動作するエミュレーション・ルーチンによって実行されます。そのため,VAX MACRO 浮動小数点演算をたとえば R7 に対して実行しても,浮動小数点レジスタ 7 には影響がありません。

  • EXAMINE コマンドを使用して .FLOAT 指示文またはその他の浮動小数点ストレージ指示文で宣言された場所を調べる場合は,デバッガは値を自動的に浮動小数点データとして表示します。

  • EXAMINE コマンドを使用して G_FLOAT データ型を調べる場合は,デバッガは 2 つのレジスタの内容を使用して VAX データの値を構築しません。
    次の例を見てください。

    EXAMINE/G_FLOAT   R4 
    


    この例で,R4 と R5 の下位のロングワードは,VAX の場合と異なり値を構築するために使用されません。代わりに,R4 のクォドワードの内容が使用されます。
    D_FLOAT の演算と G_FLOAT の演算に対してコンパイラが生成するコードは,連続する 2 つのレジスタの下位のロングワードに VAX 形式のデータを保持します。そのため,これら 2 つのレジスタのどちらかに対して EXAMINE/G_FLOAT を使用しても,正しい浮動小数点数値が得られません。また,これらどちらかのレジスタに対して DEPOSIT/G_FLOAT を実行しても,目的の結果は得られません。ただし,2 つの値の半分ずつを手動で組み合わせることはできます。たとえば,次の命令を実行したとします。

    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 
    

  • DEPOSIT コマンドを使用して, Alpha または Itanium の整数レジスタに浮動小数点データを格納することができます。構文は VAX システムでの構文と同じです。

  • H_FLOAT はサポートされていません。

  • OpenVMS I64 システムでは,入力パラメータは R16 〜 R21 ではなく R32 〜 R39 です。出力パラメータは,コンパイラによって選択された,より大きな番号のレジスタに格納されます。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.