読者です 読者をやめる 読者になる 読者になる

cookies.txt      .scr

ただのテキストファイルのようだ

gccでinline assemblyしたとき

インラインアセンブラ - 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なしでいけた。