繁体   English   中英

C语言中的汇编代码

[英]Assembler code in C

我正在尝试将汇编代码放入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;    
}

您的内容部分中有一个空条目。 不用了

尝试这个:

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'

因此,我认为您的汇编程序指令需要工作,但编译器语法尚可。

您可以使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM