linux gcc内联汇编分析memcpy

static __always_inline void __memcpy(void to, const void *from, size_t n)
{
int d0, d1, d2;
asm volatile("rep ; movsl\n\t"
"movl %4,%%ecx\n\t"
"andl $3,%%ecx\n\t"
"jz 1f\n\t"
"rep ; movsb\n\t"
"1:"
: "=&c" (d0), "=&D" (d1), "=&S" (d2) #分别表示第零个操作数(%0)--到第二个(%2)操作数
: "0" (n / 4), "g" (n), "1" ((long)to), "2" ((long)from) #分别表示第三个操作数(%3)到第六个操作数(%6);其中%3个===第%0个;%5==%1;%6==%2
: "memory");
return to;
}

n/4表示 传入的n是字节数,而这里拷贝是按四个字节一次来拷贝的。

rep ; movsl 的工作流程如下:

while(ecx) {
movl (%esi), (%edi);
esi += 4;
edi += 4;
ecx--;
}

rep ; movsb 与此类似,只是每次拷贝的不是双字(4字节),而是字节。

"=&D" (d1) 不是想将 edi 的最终值输出到 d1 中,而是想告诉 gcc edi的值早就改了,不要认为它的值还是初始化时的 dest,避免"吝啬的" gcc 把修改了的 edi 还当做 dest 来用。 而 d0、d1、d2 在开启优化后会被 gcc 无视掉(输出到它们的值没有被用过)。
  memcpy 先复制一个一个的双字,到最后如果还有没复制完的(少于4个字节),再一个一个字节地复制。

转载于:https://blog.51cto.com/11325959/2087990

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值