3

私は GCC を初めて使用するので、インライン アセンブリ コードの問題に直面しています。UINT32問題は、C 変数 (タイプは) の内容を registerにコピーする方法を理解できないことですeax。以下のコードを試しました:

__asm__
(
    // If the LSB of src is a 0, use ~src.  Otherwise, use src.
    "mov     $src1, %eax;"
    "and     $1,%eax;"
    "dec     %eax;"
    "xor     $src2,%eax;"

    // Find the number of zeros before the most significant one.
    "mov     $0x3F,%ecx;"
    "bsr     %eax, %eax;"
    "cmove   %ecx, %eax;"
    "xor     $0x1F,%eax;"
);

ただしmov $src1, %eax;、機能しません。

誰かがこれに対する解決策を提案できますか?

4

1 に答える 1

13

あなたが探しているのは拡張アセンブリだと思います。

    int a=10, b;
    asm ("movl %1, %%eax;   /* eax = a */
          movl %%eax, %0;" /* b = eax */
         :"=r"(b)         /* output */
         :"r"(a)         /* input */
         :"%eax"        /* clobbered register */
         );        

上記の例では、 の値をアセンブリ命令とレジスタbを使用した値と等しくしました。aeax

int a = 10, b;
b = a;

インライン コメントを参照してください。

ノート:

mov $4, %eax          // AT&T notation

mov eax, 4            // Intel notation

GCC 環境でのインライン アセンブリについてよく読んでください。

于 2013-01-24T05:56:13.653 に答える