ASM (Alpha のみ)

非要素別処理組込み関数 (総称):実行形式プログラム中で機械語命令を使用することができます。

形式

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) です。