インラインアセンブラ - falcon071011.log
http://falcon071011.com/2013/10/20/inline-assembler/
にて提起されたことについて。
エラーに出ているような行はインラインアセンブラ中に見当たらないし、書いたとこ以外でエラーしてると見える。
一応試してみたが、
__asm__ (".intel_syntax noprefix");で全く同じエラーが出た。(movlっておいしいの?)
エラーメッセージから/tmp以下にランダムな名前でアセンブラファイルを作り、アセンブルしていることが読み取れる。
実際に読んでみると、
$ cat /tmp/cc2jgZsM.s
.file "a.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
#APP
# 2 "a.c" 1
.intel_syntax noprefix
# 0 "" 2
#NO_APP
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.1 20130725 (prerelease)"
.section .note.GNU-stack,"",@progbitsそんな気はしていたが、インラインアセンブラは型にはめているだけ。
で、オプションで.intel_syntaxとかつけちゃっているから、はまっている型の部分でエラーが出るよね、ということ。
ちなみに -masm=intelをつけると
.file "a.c"
.intel_syntax noprefix
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
#APP
# 2 "a.c" 1
.intel_syntax noprefix
# 0 "" 2
#NO_APP
mov eax, 0
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.1 20130725 (prerelease)"
.section .note.GNU-stack,"",@progbits型にちゃんと.intel_syntaxがついているので、わざわざ書く必要はないのかなという感じ。
明示的に示す必要性があるのかないのかはしらないけど。
素直に-masm=intelをつけよう。
追記
とおもったけどよく考えたら、エラーが出ているのは.intel_syntaxの直後で、それ以前のAT&Tのとこではエラーが出ていない。
ということは、syntaxのディレクティブは途中で変更可能ということ。
すなわち、
__asm__ ( ".intel_syntax noprefix;" "mov eax, 0;" ".att_syntax;" )
で-masmなしでいけた。