C语言内嵌汇编的问题
能帮我注释下吗?我能看懂的不多
static inline void *__memcpy(void * to , const void * from , size_t n)
{
int d0,d1,d2;
__asm__ __volatile__(
"rep ; movsl\n\t"
"testb $2,%b4\n\t"
"je 1f\n\t"
"movsw\n"
"1:\ttestb $1,%b4\n\t"
"je 2f\n\t"
"movsb\n"
"2:"
:"=&c"(d0),"&=&D"(d1),"=&S"(d2)
:"0"(n/4),"q"(n),"1"((long) to),"2"((long) from)
:"memory");
return(to);
}
注释
:"=&c"(d0),"=&D"(d1),"=&S"(d2)
:"0"(n/4),"g"(n),"1"((long) to),"2"((long) from)
d0是%0,由ecx赋值; d1是%1,由edi赋值; d2是%2, 由esi赋值。
"1"((long )to)的意思就是, 把to转换为long类型,赋值给%1——在本例中也就是EDI寄存器
表3-4 常用寄存器加载代码说明
a
使用寄存器eax
m
使用内存地址
b
使用寄存器ebx
o
使用内存地址并可以加偏移值
c
使用寄存器ecx
I
使用常数0-31
d
使用寄存器edx
J
使用常数0-63
S
使用esi
K
使用常数0-255
D
使用edi
L
使用常数0-65535
q
使用动态分配字节可寻址寄存器(eax、ebx、ecx或edx)
M
使用常数0-3
r
使用任意动态分配的寄存器
N
使用1字节常数(0-255)
g
使用通用有效的地址即可(eax、ebx、ecx、edx或内存变量)
O
使用常数0-31
A
使用eax与edx联合(64位)
=
输出操作数。输出值将替换前值
+
表示操作数可读可写
&
早期会变的(earlyclobber)操作数。表示在使用完操作数之前,内容会被修改