日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:仮想アドレス空間の概要
第 3 章:システム・サービスの 64 ビット・アドレッシングのサポート
第 4 章:メモリ管理 VLM 機能
第 5 章:64 ビット・アドレッシングを対象とする RMS インタフェースの強化
第 6 章:ファイル・システムの 64 ビット・アドレッシングのサポート
第 7 章:OpenVMS Alpha デバイスの 64 ビット・アドレッシングのサポート
第 8 章:OpenVMS Alpha 64 ビット API ガイドライン
第 9 章:64 ビット・アドレッシングをサポートする OpenVMS Alpha ツールおよびユーティリティ
第 10 章:言語およびポインタの 64 ビット・アドレッシング・サポート
第 11 章:DEC C RTL の 64 ビット・アドレッシング・サポート
付録 A :64 ビット・アドレッシングのための C マクロ
付録 B :64 ビット・アドレッシングのための MACRO-32 マクロ
付録 C :64 ビット・プログラム例
付録 D :VLM プログラム例
索引
PDF
OpenVMS ホーム
Open VMS Alpha オペレーティング・システム | HPE 日本

Open VMS Alpha オペレーティング・システム
64 ビット・アドレッシングおよび VLM 機能説明書


目次 索引

付録 B
64 ビット・アドレッシングのための MACRO-32 マクロ

ここでは 64 ビット・アドレスの操作,64 ビット値の下位 32 ビットの符合拡張のチェック,および 64 ビット形式のディスクリプタをチェックする MACRO-32 マクロについて説明します。

これらのマクロはディレクトリ ALPHA$LIBRARY:STARLET.MLB (たいていは SYS$LIBRARY:STARLET.MLB と同じ)にあり,アプリケーション・コードとシステム・コードの両方で使用できます。ページ・マクロも 64 ビット・アドレス用に強化されています。このサポートは新しいパラメータ QUAD=NO/YES によって提供されます。

この付録で説明されているマクロに対して特定の引数を使用することで,レジスタ・セットを指定できることに注意してください。レジスタ・セットを表すには,レジスタをカンマで区切ってリストし,これを不等号で囲みます。次に例を示します。


<R1,R2,R3> 

レジスタ・セット内のレジスタが 1 つだけの場合は,これを囲む不等号を省略します。

B.1 64 ビット・アドレスを操作するマクロ

この節では,64 ビット・アドレスの操作を目的として設計されている次のマクロについて説明します。

  • $SETUP_CALL64

  • $PUSH_ARG64

  • $CALL64




呼び出しシーケンスを初期化します。

形式

$SETUP_CALL64 arg_count, inline=true または false


パラメータ



arg_count

呼び出し内の引数の個数。

inline

TRUE が設定されている場合,JSB ルーチンを作成せずインライン展開を実行します。引数が 6 個以下の場合,省略時の設定は INLINE=FALSE です。

説明

このマクロは,64 ビット CALL の状態を初期化します。 $PUSH_ARG64 および $CALL64 を使用する前に,これを使用しなければなりません。

引数の個数が 6 個以下の場合,コードは常にインラインです。

省略時の設定では,引数の個数が 6 個を越える場合,JSB ルーチンが作成され,このルーチンを起動して実際の呼び出しを実行します。しかし,INLINE=TRUE でインライン・オプションが指定されると,コードはインラインで生成されます。このオプションは,オプションの対象となるコードのスタックの深さが固定の場合に限って有効です。 RUNTIMSTK または VARSIZSTK メッセージが表示されない場合,スタックの深さが固定であると仮定できます。それ以外の場合,スタック・アライメントが少なくともクォドワードでないと,呼び出されたルーチン,および呼び出されたルーチンが呼び出すものの中で,アライメント異常が発生する可能性があります。省略時の設定の動作 (INLINE=FALSE) ではこの問題は発生しません。

引数の個数が 6 個を越える場合, $SETUP_CALL64 と対応する $CALL64 との間で, AP または SP への参照は行われません。これは,$CALL64 が別の JSB ルーチンにある場合があるからです。また,一時的なレジスタ (R16 以上) は $SETUP_CALL64 以降,有効ではありません。ただし,R16 〜 R21 がすでに設定されている引数レジスタと関係する場合を除いて,これらを範囲の中で使用することはできます。このような場合,上位の一時レジスタを代わりに使用します。

注意

$SETUP_CALL64,$PUSH_ARG64,および $CALL64 マクロは,インライン・シーケンスの中で使用することを目的としています。つまり,$SETUP_CALL64/$PUSH_ARG64/$CALL64 シーケンスの中央に分岐したり, $PUSH_ARG64 マクロの回りで分岐することはできず,シーケンスを出て $CALL64 を避けることもできません。




呼び出しの引数プッシュに相当する機能を実行します。

形式

$PUSH_ARG64 引数


パラメータ



引数

プッシュされる引数。

説明

このマクロは,64 ビット呼び出しの 64 ビット引数をプッシュします。なお,$PUSH_ARG64 を使用する前にマクロ $SETUP_CALL64 を使用しなければなりません。

引数はアラインされたクォドワードとして読み込まれます。つまり,$PUSH_ARG64 4(R0) という指定は,4(R0) でクォドワードを読み込み,クォドワードをプッシュします。インデックス操作はクォドワード・モードで行われます。

メモリのロングワード値をクォドワード値としてプッシュする場合,まずこれを,ロングワード命令でレジスタに移動し,レジスタ上で $PUSH_ARG64 を使用します。同様に,アラインされていないクォドワード値をプッシュするには,まずこれを一時レジスタに移動し $PUSH_ARG64 を使用します。

呼び出しの引数の個数が 6 個を越える場合,このマクロは引数内の SP 参照または AP 参照をチェックします。呼び出しの引数の個数が 6 個を越える場合,SP 参照は認められず,また, AP 参照はインライン・オプションが使用されている場合に限って認められます。

マクロは,現在の $CALL64 に対してすでに設定されている,引数レジスタへの参照についてもチェックします。このような参照が検出されると,引数レジスタが $PUSH_ARG64 内でのソースとして使用される前に,これを上書きすることがないよう,注意を促す警告メッセージが表示されます。

引数の個数が 6 個以下の場合にも,AP 参照について同じチェックが行われます。これは認められますが,コンパイラではその使用前に上書きすることを禁止できません。このため,このような参照が検出されると,情報メッセージが表示されます。

オペランドが,R16 〜 R21 のいずれかの文字列をその名前に含むシンボルを,レジスタ参照以外で使用する場合,このマクロは,間違ったエラーを報告することがあります。たとえば, R21 が設定された後で $PUSH_ARG64 SAVED_R21を起動すると,このマクロは,(必要でないのに)引数レジスタの上書きに関する情報メッセージを表示します。

$PUSH_ARG64 は条件付きコードの中で使用できないことにも注意してください。 $PUSH_ARG64 は,引数の個数などを追跡するシンボルを更新します。 $SETUP_CALL64/$CALL64 シーケンスの中央で, $PUSH_ARG64 の回りに分岐するコードを作成しようとしても,正しく動作しません。




ターゲット・ルーチンを起動します。

形式

$CALL64 call_target


パラメータ



call_target

起動するルーチン。

説明

このマクロは,$SETUP_CALL64 で引数の個数を指定し, $PUSH_ARG64 でクォドワード引数をプッシュしたものとして,指定されたルーチンを呼び出します。このマクロは,プッシュの回数がセットアップ呼び出しの中で指定された回数に一致するかチェックします。

call_target オペランドが AP ベースまたは SP ベースであってはなりません。



ここで説明するマクロは,特定の値を含んでいるかチェックし,そのチェックの結果に基づきプログラム・フローを決めます。




64 ビット値の下位 32 ビットの符号拡張をチェックし,チェックの結果に基づいて,プログラム・フローを指示します。

形式

$IS_32BITS quad_arg, leq_32bits, gtr_32bits, temp_reg=22


パラメータ



quad_arg

レジスタまたはアラインされたクォドワード・メモリ位置のいずれかにある 64 ビット値。

leq_32bits

quad_arg が 32 ビット符号拡張値の場合の分岐先のラベル。

gtr_32bits

quad_arg が 32 ビットを越える場合の分岐先のラベル。

temp_reg=22

ソース値の下位ロングワードを保持する一時レジスタとして使用するレジスタ。省略時の設定の値は R22 です。

説明

$IS_32BITS は 64 ビット値の下位 32 ビットの符号拡張をチェックし,チェックの結果に基づいて,プログラム・フローを指示します。



使用例

#1

$is_32bits  R9, 10$ 

この例では,省略時の設定の一時レジスタ R22 を使用して, R9 の64 ビット値の下位 32 ビットの符号拡張をチェックします。分岐の種類およびチェックの結果によって,プログラムは分岐,またはインラインを継続します。

#2

$is_32bits  4(R8), 20$, 30$, R28 

この例では,一時レジスタ R28 を使用して, 4(R8) の64 ビット値の下位 32 ビットの符号拡張をチェックし,その結果によって,20$ または 30$ に分岐します。




指定されたディスクリプタをチェックし,これが 64 ビット形式のディスクリプタかどうかを判断し,チェックの結果に基づいてプログラム・フローを指示します。

形式

$IS_DESC desc_addr, target, size=long or quad


パラメータ



desc_addr

チェックするディスクリプタのアドレス。

target

ディスクリプタが 64 ビット形式の場合の分岐先のラベル。

size=long

ディスクリプタを示しているアドレスのサイズ。 "long" (省略時の設定) および "quad" が有効。

説明

$IS_DESC64 は,64 ビット・ディスクリプタと 32 ビット・ディスクリプタを区別するフィールドをチェックします。これが 64 ビット形式の場合,指定されたターゲットに分岐が行われます。 SIZE=QUAD が指定されていない限り,チェックするアドレスはロングワードとして読み込まれます。



使用例

#1

$is_desc64 r9, 10$ 
 

この例では,R9 によって示されるディスクリプタがチェックされ,これが 64 ビット形式の場合は 10$ への分岐が行われます。

#2

$is_desc64 8(r0), 20$, size=quad 

この例では,8(R0) のクォドワードが読み込まれ,これが示すディスクリプタがチェックされます。これが 64 ビット形式の場合は 20$ への分岐が行われます。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項