C中的汇编代码

时间:2013-10-30 11:37:44

标签: c assembly inline-assembly

我正在尝试将汇编代码放入我的C函数中。 此功能的目的是将存储在src地址中的值复制到dst地址:

void copy(int *dst, int *src);

我实际有问题的代码:

void copy(int *dst, int *src)
{
    asm("mov %1, %2"
        : /* no output */
        : "i" (dst),
          "i" (src)
        : ""
    );  
}

给我错误:

test.c: In function ‘copy’:
test.c:29: error: unknown register name ‘’ in ‘asm’
test.c:29: warning: asm operand 0 probably doesn’t match constraints
test.c:29: warning: asm operand 1 probably doesn’t match constraints

第29行是这一行:
asm("mov %1, %2"

修改

asm("mov %0, %1"
    : "=m" (dst)
    : "m" (dst),
      "m" (src)
    : ""
    );

现在给我:
error: unknown register name ‘’ in ‘asm’ 我不知道如何处理上一节。

EDIT2

我读过我无法移动内存 - >内存,我需要使用寄存器。而且我还需要使用AT& T语法,因此它就像“mov src,dest”。下面的代码编译,但不幸的是,dst指向的地址中的值是0,而不是我放在src指向的地址中的值。

asm("movl %1, %%eax \n\t"
    "movl %%eax, %0 \n\t"
    : "=m" (dst)
    : "m" (dst),
      "m" (src)
    );

EDIT3

我这样做了(更改了参数),现在可以使用了:

void copy(int *dst, int *src, int n)
{
    int a = *src;
    int b = *dst;
    asm("movl   %1, %%eax\n"
        "movl   %%eax, %0\n"
        : "=m" (b)
        : "m" (a)
        );
    *src = a;
    *dst = b;    
}

2 个答案:

答案 0 :(得分:2)

您的clobber部分中有一个空条目。你不需要那个。

试试这个:

asm("mov %0, %1"
    : "=m" (dst)
    : "m" (dst),
      "m" (src)
    /* no clobbers */
    );

该代码与此完全相同:

*dst = *src

所以我认为这只是一个小例子?

代码编译,但给出:

t.c: Assembler messages:
t.c:2: Error: too many memory references for `mov'

所以我认为你的汇编指令需要工作,但编译器语法还可以。

答案 1 :(得分:0)

您可以使用:

void copy(int *dst, int *src)
{
  __asm__ __volatile__(
    "movl (%0), %%eax\n" 
    "movl %%eax, (%1)\n"
    :
    : "r"(src), "r"(dst)
    : "%eax"
  );
}

相当于:

mov    (%edx), %eax   ; eax = *src
mov    %eax, (%ecx)   ; *dst = eax