linux gcc 汇编,linux gcc内联汇编分析memcpy

static __always_inline void __memcpy(voidto, 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个字节),再一个一个字节地复制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值