インライン・アセンブリー・ステートメントの例 (IBM 拡張)
例 1: 次の例は、m 制約の使用法を示しています。
int main(void) {
int val=40, dest;
__asm__(" ST %1,%0¥n"
:"=m"(dest)
:"r"(val)
);
return 40 == dest ? 55 :66;
}
この例で、命令 ST の構文は RS,D(RA) です。 D は変位、R はレジスターです。 D+RA は D(RA) から計算されて、有効アドレスを形成します。制約 m を使用することによって、レジスターと変位を別々に指定して有効アドレスを手動で構築する必要がなくなります。
例 2: 次の例は、入力および出力オペランドのシンボル名の使用法を示しています。
int main(void){
int sum = 0, one=1, two = 2;
__asm ("AR %[result], %[first]¥n"
"AR %[result], %[second]¥n"
:[result] "+r"(sum)
:[first] "r"(one),
[second] "r"(two)
);
return sum == 3 ? 0 : 1;
}
この例で、%[result] は出力オペランド変数 sum を参照し、%[first] は入力オペランド変数 one を参照し、%[second] は入力オペランド変数 two を参照します。
例 3: 次の例は、= 修飾子および r 制約の使用法を示しています。
int main(void) {
int res = 25;
int newRes = 55;
__asm(" LR %0,%1¥n" :"=r"(res) :"r"(newRes));
return res;
}
LR 命令は、2 番目の汎用レジスターの内容を最初のレジスターに入れます。%0 および %1 オペランドは、出力/入力オペランド欄の C 式によって置換されます。
出力オペランドは、= 修飾子を使用して、変更可能オペランドが必須であることを示し、r 制約を使用して、汎用レジスターが必須であることを示します。 同様に、入力オペランドの r 制約は、汎用レジスターが必要であることを示します。 これらの制約事項の範囲内で、コンパイラーは %0 および %1 を置換するレジスターを自由に選択できます。
例 4: 次の例は、+ 修飾子および K 制約の使用法を示しています。
int main(void) {
int res = 25;
__asm(" AHI %0,%1¥n"
:"+r"(res)
: "K"(30)
);
return res;
}
このアセンブリー・ステートメントはオペランド %0 とオペランド %1 を加算し、その結果をオペランド %0 に書き込みます。出力オペランドで + 修飾子を使用することで、命令がオペランド%0 を読み書きできることを指定します。K 制約は、オペランド %1 にロードされた値が整数定数値でなければならないことを示します。