2

XCode LLVM-GCCコンパイラを使用して正常にコンパイル(および動作)する次の2つの定義を取得しました。

#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }

ただし、コンパイラをApple LLVMに変更すると、次のエラーが発生しました。

Expected '(' after 'asm'

{}を()に置き換えましたが、それではうまくいきません。そのエラーをグーグルで検索しても、有用なものは見つかりませんでした...誰か?

4

2 に答える 2

4

インラインアセンブリの__asm {...}スタイルは非標準であり、clangではサポートされていません。代わりに、C++はインラインアセンブリ構文をとして指定asm("...")します。引用符に注意してください。また、clangはAT&Tアセンブリ構文を使用するため、安全のためにマクロを書き直す必要があります。

ただし、Microsoftの非標準のアセンブリ構文、およびそれに伴うIntelスタイルのアセンブリのサポートを改善するためにいくつかの作業が行われています。これまでに行われたことを可能にするオプションがあります-fenable-experimental-ms-inline-asmが、それがいつ導入されたか、または使用しているclangのバージョンでのサポートがどれほど優れているかはわかりません。表示されているコードを使った簡単な試みは、SVNトランクの最近のバージョンのclangで機能するようです。

#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }

int main() {
    int i;
    int s;
    SAVE_STACK(i);
    RESTORE_STACK;
}

clang++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm -S -o -

        .def     main;
        .scl    2;
        .type   32;
        .endef
        .text
        .globl  main
        .align  16, 0x90
main:                                   # @main
# BB#0:                                 # %entry
        pushq   %rax
        #APP
        .intel_syntax
        mov dword ptr [rsp + 4], ESP
        .att_syntax
        #NO_APP
        #APP
        .intel_syntax
        sub ESP, dword ptr [rsp]
        .att_syntax
        #NO_APP
        xorl    %eax, %eax
        popq    %rdx
        ret

そして、このコマンドclang++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asmは実行可能な実行可能ファイルを生成します。

ただし、それでも次のような警告が表示されます。

警告:MSスタイルのインラインアセンブリはサポートされていません[-Wmicrosoft]

于 2012-11-09T20:25:43.190 に答える
4

次のコードが正しくコンパイルされたXCode開発環境の使用に問題があります。makefileに切り替えると、次のエラーメッセージが表示されましたExpected '(' after 'asm'

#define DebugBreak()  { __asm { int 3 }; }
int main(int argc, const char *argv[])
{
    DebugBreak();
}

の定義はDebugBreak()、VisualStudioでコンパイルされた私のコードからのものであることに注意してください。

makeファイルでこれを修正する方法は、引数を追加することでした-fasm-blocks

CFLAGS += -std=c++11 -stdlib=libc++ -O2 -fasm-blocks

于 2017-05-29T15:13:41.403 に答える