2月
19
その1の続き
一つ重要なテストを忘れていました。 Extended Asm の Input Operand です。
[umezawa@metis:ttys002 ~]$ cat intel.c int main(int argc, char** argv) { int ret; asm volatile( ".intel_syntax\n" "mov eax, %1\n" : "=a"(ret) : "r"(argc) ); return ret; } [umezawa@metis:ttys002 ~]$ clang -masm=intel intel.c intel.c:6:4: error: unknown token in expression "mov eax, %1\n" ^:2:11: note: instantiated into assembly here mov eax, %edi ^ intel.c:6:4: error: unknown token in expression "mov eax, %1\n" ^ :2:11: note: instantiated into assembly here mov eax, %edi ^ 2 errors generated.
Intel 記法だって言ってるのに AT&T 記法でオペランドを埋め込もうとしています。ダメじゃねぇか。
というわけで、標準コンパイラが Clang であるような世界ではインラインアセンブラの Intel 記法と input operand (の i/r/m 制約あたり)はロクに併用できないことになります。わざわざ GCC をインストールしてもいいんですが、 Mac (というか Xcode)だとそれも大変です。
よくもまあこんな状態で “In general, Clang is highly compatible with the GCC inline assembly extensions” などと書けたもんである。バグレポートはされている (1, 2) けど1年半たってるし直す気が無いらしい。
Clang のインラインアセンブラで Intel 記法を使う (その3)
その2の続き Intel 記法と Input Operand (の一部の制約)は併用できないわけですが、手持ちのソースを AT&T 記法に変換するのもチョー大変なので別の方法を。 x86 の場合、こういうもの…