[英]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.