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