3

由于我对 GCC 很陌生,因此我在内联汇编代码中遇到了问题。问题是我无法弄清楚如何将 C 变量(类型为UINT32)的内容复制到寄存器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等于a使用汇编指令和eax寄存器的值:

int a = 10, b;
b = a;

请参阅内联评论。

笔记:

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

mov eax, 4            // Intel notation

关于GCC 环境中的内联汇编的好读物。

于 2013-01-24T05:56:13.653 回答