C语言内嵌汇编的问题

ouyangjinlin 2010-05-08 07:52:05
能帮我注释下吗?我能看懂的不多
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)操作数。表示在使用完操作数之前,内容会被修改


...全文
147 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰满 2010-09-21
  • 打赏
  • 举报
回复
呵呵,最好还是买本书籍好好自己学习一下啊,即使标注了,对你帮助也不大的哦
wgw_lucky 2010-09-21
  • 打赏
  • 举报
回复
学习学习!~~~
huer0625 2010-05-09
  • 打赏
  • 举报
回复
你能把具体的问题说出吗?呵呵,如果是语言不懂。那你应该先学习语言。呵呵
likaiyouxi520 2010-05-09
  • 打赏
  • 举报
回复
标记,学习!!
  • 打赏
  • 举报
回复
标记,学习!!

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧