【发布时间】:2014-10-04 08:57:44
【问题描述】:
这个函数“strcpy”的目的是将src的内容复制到dest,效果很好:显示两行“Hello_src”。
#include <stdio.h>
static inline char * strcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__("1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
: "0"(src),"1"(dest)
: "memory");
return dest;
}
int main(void) {
char src_main[] = "Hello_src";
char dest_main[] = "Hello_des";
strcpy(dest_main, src_main);
puts(src_main);
puts(dest_main);
return 0;
}
我尝试将行
: "0"(src),"1"(dest)更改为: "S"(src),"D"(dest),出现错误:‘asm’ operand has impossible constraints。我只是无法理解。我认为这里的“0”/“1”指定了与第 0/第 1 个输出变量相同的约束。第 0 个输出的约束是=&S,第 1 个输出的约束是=&D。如果我改变0-->S,1-->D,应该没有错。怎么回事?“clobbered 寄存器”或 earlyclobber 操作数(&)有什么用吗?我尝试去掉“&”或者“memory”,两种情况的结果都和原来的一样:输出两行“Hello_src”字符串。那么我为什么要使用“破坏”的东西呢?
【问题讨论】:
-
: "=&S" (d0), "=&D" (d1), "=&a" (d2)行无效,删除后可以更改“0”和“1”