글 수 83
예전에 하이텔 게제동 게시판에 올렸던 글입니다.
제 목:[답변] 25443 메모리 전송 관련자료:없음 [25447]
보낸이:유영천 (yuchi ) 2001-01-15 21:47 조회:164
윈도우에서..아니 정확히는 비주얼씨의 memcpy를 사용하면
4바이트전송을 합니다.
13바이트나 1바이트나 3바이트..이런건 몽땅 4바이트 전송을 할 수 없죠.
4바이트씩 카피할 수 없는 경우는 2진수로 보았을때 첫째자리가 1인 경우
둘째자리가 1인 경우입니다.
따라서 첫째자리부터 검사합니다.첫째비트가 1이면 1바이트 먼저 카피하고
카피할 길이에서 1을 뺍니다.
둘째다리를 검사해서 1이면 2바이트 카피하고 카피할 길이에서 2를 뺍니다.
(둘째비트가 1이면 10진수로 2니까)
여기까지 진행했으면 카피할 길이는 0이거나 무조건 4로 나눠지는 숫자입니다.
간단하게 구현해봅시다.
void memcpy(void* dest,void* src,DWORD len)
{
__asm
{
mov ecx,dword ptr[len]
mov esi,dword ptr[src]
mov edi,dword ptr[dest]
test ecx,1
jz lb_cpy_2
movsb
dec ecx
lb_cpy_2:
test ecx,2
jz lb_cpy_4
movsw
sub ecx,2
jz lb_cpy_end
lb_cpy_4:
shr ecx,2
rep movsd
lb_cpy_end:
}
}
간단하죠? 테스트안해보고 그냥 적은거라 틀린 부분이 있을수도 있습니다만
기본 로직은 이런 식입니다.비졀시의 memcpy가 위와 똑같지는 않습니다.
레지스터는 32비트(4바이트)짜리고 곧 메모리와의 데이터라인도 32개이기
때문에 4바이트 전송은 당연히 이루어지는 것입니다.
단 mov ax,word ptr[esi] 라든가
이런식의 코드라면 2바이트 전송이죠.
mmx를 이용한 8바이트 전송도 있고 sse를 이용한 16바이트 전송도 있습니다만
sse 16바이트 카피는 진짜 느리고 mmx 8바이트 전송은 펜2 이전 기종에서만
빛을 발합니다.펜2 이상에선 4바이트 전송보다 못할때가 많습니다.
그럼..
제 목:[답변] 25443 메모리 전송 관련자료:없음 [25447]
보낸이:유영천 (yuchi ) 2001-01-15 21:47 조회:164
윈도우에서..아니 정확히는 비주얼씨의 memcpy를 사용하면
4바이트전송을 합니다.
13바이트나 1바이트나 3바이트..이런건 몽땅 4바이트 전송을 할 수 없죠.
4바이트씩 카피할 수 없는 경우는 2진수로 보았을때 첫째자리가 1인 경우
둘째자리가 1인 경우입니다.
따라서 첫째자리부터 검사합니다.첫째비트가 1이면 1바이트 먼저 카피하고
카피할 길이에서 1을 뺍니다.
둘째다리를 검사해서 1이면 2바이트 카피하고 카피할 길이에서 2를 뺍니다.
(둘째비트가 1이면 10진수로 2니까)
여기까지 진행했으면 카피할 길이는 0이거나 무조건 4로 나눠지는 숫자입니다.
간단하게 구현해봅시다.
void memcpy(void* dest,void* src,DWORD len)
{
__asm
{
mov ecx,dword ptr[len]
mov esi,dword ptr[src]
mov edi,dword ptr[dest]
test ecx,1
jz lb_cpy_2
movsb
dec ecx
lb_cpy_2:
test ecx,2
jz lb_cpy_4
movsw
sub ecx,2
jz lb_cpy_end
lb_cpy_4:
shr ecx,2
rep movsd
lb_cpy_end:
}
}
간단하죠? 테스트안해보고 그냥 적은거라 틀린 부분이 있을수도 있습니다만
기본 로직은 이런 식입니다.비졀시의 memcpy가 위와 똑같지는 않습니다.
레지스터는 32비트(4바이트)짜리고 곧 메모리와의 데이터라인도 32개이기
때문에 4바이트 전송은 당연히 이루어지는 것입니다.
단 mov ax,word ptr[esi] 라든가
이런식의 코드라면 2바이트 전송이죠.
mmx를 이용한 8바이트 전송도 있고 sse를 이용한 16바이트 전송도 있습니다만
sse 16바이트 카피는 진짜 느리고 mmx 8바이트 전송은 펜2 이전 기종에서만
빛을 발합니다.펜2 이상에선 4바이트 전송보다 못할때가 많습니다.
그럼..
.386
.model flat
.code
memcpy proc C uses esi edi ecx dest:PTR BYTE,source:PTR BYTE,ln:DWORD
cld
mov esi,[source]
mov edi,[dest]
mov ecx,[ln]
shr ecx,2
rep movsd
mov ecx,[ln]
and ecx,3
rep movsb
ret
memcpy endp
end