2008/12/09

gccインラインアセンブラ

gccのasm命令を使うことで,Cの中でインラインアセンブラを使える.

【構文】
asm volatile ("アセンブラテンプレート"
: "出力オペランド"
: "入力オペランド"
: "アセンブラの実行で変更されてしまうもの");

[アセンブラテンプレート]
ニーモニックを指定する.
"cpuid"とか"mov"とか.
複数指定することもできる.

[出力オペランド]
下記のように指定する
"=a" (出力先変数), "=b" (出力先変数)
ex)
"=a (buf)" はeaxレジスタの内容を変数bufに出力することを示す.

[入力オペランド]
"a" (入力)のように指定する
"0"(入力)と指定すると,1番目に指定した出力オペランドの制約条件を流用する.
ex)
"a" (0) はEAXレジスタに入力として0を与えることを示す.

【オペランドの制約条件】
"=" asmが終わった後に変更された結果が指定された変数に代入される
"a" eax
"b" ebx
"c" ecx
"d" edx
"A" edx:eax(上位bitにedx,下位bitにeax)
"g" gccが適当なレジスタに割り当てる

【例】
unsigned int a, b, c, d;
asm volatile ("cpuid" : "=a"(a), "=b"(b), "=c"(c), "=d"(d) : "a"(0));
// 変数a,b,c,dにcpuidで取得した情報が格納される


【参考】
GCC-インラインアセンブリ-HOWTO (日本語訳)
gccのx86インラインアセンブリに関して

Binary Hacks ―ハッカー秘伝のテクニック100選

0 件のコメント: