����14-15 linux/include/asm/memory.h


  1 /*

  2  *  NOTE!!! memcpy(dest,src,n) assumes ds=es=normal data segment. This

  3  *  goes for all kernel functions (ds=es=kernel space, fs=local data,

  4  *  gs=null), as well as for all well-behaving user programs (ds=es=

  5  *  user data space). This is NOT a bug, as any user program that changes

  6  *  es deserves to die if it isn't careful.

  7  */

    /*

     * ע��!!!memcpy(dest,src,n)����μĴ���ds=es=ͨ�����ݶΡ����ں���ʹ�õ�

     * ���к��������ڸü��裨ds=es=�ں˿ռ䣬fs=�ֲ����ݿռ䣬gs=null��,��������

     * ��Ϊ��Ӧ�ó���Ҳ��������ds=es=�û����ݿռ䣩������κ��û���������Ķ���

     * es�Ĵ������������򲢲�������ϵͳ���������ɵġ�

     */

    //// �ڴ�鸴�ơ���Դ��ַsrc����ʼ����n���ֽڵ�Ŀ�ĵ�ַdest����

    // ������dest - ���Ƶ�Ŀ�ĵ�ַ��src - ���Ƶ�Դ��ַ��n - �����ֽ�����

    // %0 - edi(Ŀ�ĵ�ַdest)��%1 - esi(Դ��ַsrc)��%2 - ecx(�ֽ���n)��

  8 #define memcpy(dest,src,n) ({ \

  9 void * _res = dest; \

 10 __asm__ ("cld;rep;movsb" \                // ��ds:[esi]���Ƶ�es:[edi]������esi++��edi++��

                                              // ������ecx(n)�ֽڡ�

 11         ::"D" ((long)(_res)),"S" ((long)(src)),"c" ((long) (n)) \

 12         :"di","si","cx"); \

 13 _res; \

 14 })

 15