1

GCC は、次のコードの登録エラーの後にジャンク `-4(%ebp)' を伝えます:

  static __inline__ int xchg_asm(int* lock, int val)
    {
        int ret;

        __asm__ __volatile__(
                    LOCK "movl %1,%%eax;  xchg (%1),%2  ; movl %%eax %0"
                    :"=m" (ret)
                    :"d"(lock), "c"(val));
        return ret;
    }

変更方法がわかりません。

4

3 に答える 3

0

gas(gcc で使用される GNU アセンブラー) は、セミコロンではなく改行を行末として想定します。"\n"代わりに使ってみました";"か?

于 2012-06-30T13:05:10.990 に答える
0

この行がありません

LOCK "movl %1,%%eax; xchg (%1),%2 ; movl %%eax %0"

最後の引数の前にセミコロンがありません。

于 2014-12-23T13:27:58.370 に答える
0

すべての asm 命令の後に '\n' を追加してみてください:

 __asm__ __volatile__(
                LOCK "movl %1,%%eax \n  xchg (%1),%2 \n movl %%eax, %0 \n"
                :"=m" (ret)
                :"d"(lock), "c"(val));
    return ret;
}

このようなエラーが発生した場合は、GCC のオプションを使用してソースをアセンブラー ファイルにコンパイルし、-Sgas によって報告された行を確認します。

于 2012-06-30T13:06:06.353 に答える