非要素別処理組込み関数 (総称):実行形式プログラム中で機械語命令を使用することができます。
形式
result = ASM (string [, a,...]})
string
文字型。これは,機械語命令を含んでいる文字定数,または複数の文字定数が連結されたものです。
a
(省略可能) 任意の型。たとえば,命令の元になる引数または対象の引数を宣言することができます。
結果
結果は INTEGER(8),REAL(4),または REAL(8) 型のスカラです。
引数は値によって渡されます。引数を参照渡しで渡したい場合は (たとえば,全体配列,文字列,または記録構造体など),%REF ビルトイン関数を使用することができます。
文番号を使用することができますが,すべての引用は同じ ASM 関数から行われなくてはなりません。これにより,たとえばループ構文を設定することができます。ASM 関数間での飛び越しはできません。
一般に,ASM 関数は,組込み関数が使用できる任意の場所に置くことができます。宣言された機械語コード,機械語指示文,または機械語データはコード列に統合されるため,コンパイラはそのコードが Fortran で書かれていたかのように,別のレジスタ,より優れたコード列などを選択する可能性があります。
ユーザーは命令列とレジスタを完全に制御することはできず,コンパイラは性能を高めるために,他のコードを ASM コードに混ぜることがあります。また,オプティマイザの判断により,より優れたコード列に置き換えることもあります。
レジスタ名には,ドル記号 ($) またはパーセント記号 (%) で始まる名前しか使用できません。レジスタ名の規約の詳細については,オペレーティング・システムのドキュメント・セットを参照してください。
個別名 | 引数の型 1 | 結果の型 |
---|---|---|
ASM 2 | CHARACTER | INTEGER(8) |
FASM 3 | CHARACTER | REAL(4) |
DASM 3 | CHARACTER | REAL(8) |
1 第 1 の引数。
2 値はユーザー・コードによってレジスタ $0 に格納されなくてはなりません。 3 値はユーザー・コードによってレジスタ $F0 に格納されなくてはなりません。 |
例
次に例を示します。
! 明確にするため連結をおすすめします。 ! ";" は命令を区切ることに注意してください。 ! nine=9 type *, asm('addq %0, $17, $0;'// & ! 最初の 2 つの引数を追加し, 'ldq $22, %6;'// & ! レジスタ $0 に 'ldq $23, %7;'// & ! 答えを置きます。 'ldq $24, %8;'// & ! 'mov $0, %fp;'// & ! 定数に注釈を置くことは許されませんが, 'addq $18, %fp, $0;'// & ! ここに置くことはできます。 'addq $19, $0, $0;'// & 'addq $20, $0, $0;'// & 'addq $21, $0, $0;'// & 'addq $22, $0, $0;'// & 'addq $23, $0, $0;'// & 'addq $24, $0, $0;', & 1,2,3,4,5,6,7,8,nine) ! ASM への実引数 ! (通常,値渡し) end
この例は,9 個の値を足し合わせ,結果としてその和を返す整数 ASM 関数を示しています。ユーザーが関数結果をレジスタ $0 に格納していることに注意してください。
すべての引数は値で渡されます。レジスタに入れて渡されるのではない引数には,実引数 7,8,および 9 に対応する %6,%7,および %8 という名前を付けることができます (第 1 引数は %0 です)。%fp などの予約済みレジスタを引用できることに注意してください。
コンパイラは適切な引数並びを作成します。この例では,第 1 引数の値 (1) はレジスタ $16 に置かれ,第 8 引数の値 (8) は %7 に置かれます。これは実際には 8($30) です。