Chinaunix首页 | 论坛 | 博客
  • 博客访问: 100053
  • 博文数量: 16
  • 博客积分: 530
  • 博客等级: 下士
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-17 23:25
文章分类

全部博文(16)

文章存档

2014年(1)

2012年(2)

2011年(11)

2010年(2)

我的朋友

分类: C/C++

2011-01-13 15:50:18

  1. void *
  2. memcpy (void *to, const void *from, size_t n)
  3. {
  4.     asm volatile(
  5.                 "shr $2, %2\n\t"
  6.                 "cld \n\t"
  7.                 "rep movsl \n\t"
  8.                 "mov %3, %%ecx \n\t"
  9.                 "and $3, %%ecx \n\t"
  10.                 "rep movsb"
  11. /*输出参数*/
  12.                 :
  13. /*输入参数 S->ESI   D->EDI   c->ecx   m代表内存变量*/
  14.                 :"S"(from), "D"(to), "c"(n), "m"(n)
  15.                  /*限定*/
  16. :"memory", "cc");
  17.     return to;

  18. /*
  19.     asm volatile (
  20.       "rep ; movsl\n\t"
  21.       "testb $2,%b1\n\t"
  22.       "je 1f\n\t"
  23.       "movsw\n"
  24.       "1:\ttestb $1,%b1\n\t"
  25.       "je 2f\n\t"
  26.       "movsb\n"
  27.       "2:"
  28.       :
  29.       :"c" (n/4), "q" (n),"D" ((long) to),"S" ((long) from)
  30.       : "memory");
  31.     return to;
  32.     /* %b1 代表取输入参数%1 的低字节 */
  33. */
  34. }
限定修饰
       "merory"是一个常用的限定,它表示汇编代码以不可预知的方式改变了内存,这样gcc在优化时就不会让cache到寄存器的内存变量使用该寄存器通过汇编代码,否则可能会发生同步出错.
         “cc”:你使用的指令会改变CPU的条件寄存器;
阅读(3084) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~