我在实际模式的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个字节对齐的结构。
谢谢。
答案 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)