linux内核中的memcpy实现

时间:2014-12-30 11:56:36

标签: linux assembly kernel memcpy

我在实际模式的linux内核中看到memcpy实现:

GLOBAL(memcpy)
    pushw   %si
    pushw   %di
    movw    %ax, %di
    movw    %dx, %si
    pushw   %cx
    shrw    $2, %cx
    rep; movsl
    popw    %cx
    andw    $3, %cx
    rep; movsb
    popw    %di
    popw    %si
    retl
ENDPROC(memcpy)

我理解rep; movsl之前的第一部分,但为什么是rep; movsl之后的第二部分,它已经从si - >复制了di 32个字节。为什么是第二部分,我只看到一个理由再次应对那个地址在si中未被4个字节对齐的结构。

谢谢。

1 个答案:

答案 0 :(得分:4)

以下是相关的代码行,其中包含用于解释其功能的注释:

shrw    $2, %cx   ; length /= sizeof(DWORD)
rep; movsl        ; Copy the first length/sizeof(DWORD) DWORDs
popw    %cx       ; Restore the original length
andw    $3, %cx   ; length &= 3, i.e. length %= sizeof(DWORD)
rep; movsb        ; Copy the remaining length % sizeof(DWORD) bytes (if any)