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 件のコメント:
コメントを投稿