将C变量的内容复制到寄存器(GCC)中

时间:2013-01-24 05:51:49

标签: c linux gcc assembly x86

由于我是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;不起作用。

有人可以建议解决这个问题吗?

1 个答案:

答案 0 :(得分:12)

我猜你要找的是extended assembly例如:

    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环境中inline assembly的好读。