반응형
어셈블리어를 다시 공부하려고 한다.
처음부터 정리도 해보겠지만 일단 지금 당장 사용할 수 있는 간단한 내용이 있어서 정리한다.
--------------------------------------------------------------------------------------------
소프트웨어 렌더링을 하다가 화면을 배경색으로 덮어주는 Clear() 함수를 구현하면서
4Byte의 값으로 배열을 채워주는 함수가 필요했다.
빠른 속도를 위해 memset()을 이용하려고 했으나 memset()은 1Byte 기준으로 처리가 되기 때문에
4Byte 색상을 적용하는데 좋지 못했다.
그래서 4Byte를 적용할 수 있는 MEMSET을 구현하는 방법을 찾아서 적용하였다.
소스는 다음과 같다.
inline void MEMSET_DWORD(void* dest, const DWORD data, const unsigned int count)
{
처음부터 정리도 해보겠지만 일단 지금 당장 사용할 수 있는 간단한 내용이 있어서 정리한다.
--------------------------------------------------------------------------------------------
소프트웨어 렌더링을 하다가 화면을 배경색으로 덮어주는 Clear() 함수를 구현하면서
4Byte의 값으로 배열을 채워주는 함수가 필요했다.
빠른 속도를 위해 memset()을 이용하려고 했으나 memset()은 1Byte 기준으로 처리가 되기 때문에
4Byte 색상을 적용하는데 좋지 못했다.
그래서 4Byte를 적용할 수 있는 MEMSET을 구현하는 방법을 찾아서 적용하였다.
소스는 다음과 같다.
inline void MEMSET_DWORD(void* dest, const DWORD data, const unsigned int count)
{
__asm
{
mov edi, dest
mov ecx, count
mov eax, data
rep stosd
}
}
위의 mov 명령어를 통한 레지스터 셋팅은 rep stosd 호출을 위한 값 셋팅이다.
rep - ecx
stosd - eax, edi
이런식으로 연결된다고 보면 된다.
rep -> ecx값 만큼 반복적으로 명령을 수행
stosd -> eax에 담긴 값을 edi에 복사함
stosd의 경우에는 이런 계통 명령어가 그렇듯 stosb(1Byte), stosw(2Bytes), stosd(4Bytes)명령어중
4Bytes를 복사하는 명령어이다.
stosd명령어가 edi가 가리키는 곳에 eax에 담긴 4Bytes값을 복사하면 edi는 그 뒷 주소를 가리키게 되고
rep명령어에 의해 ecx 즉 count값이 0이 될때까지 이를 반복하기 때문에 memset과 같은 기능을 하게 된다.
--------------------------------------------------------------------------------------------
아직 SIMD등 병렬적인 처리가 되는 부분은 익숙하지 않아서
적용해 보지 못했지만 어셈블리어를 다시 공부하면서 적용해 보려고 한다.
위의 mov 명령어를 통한 레지스터 셋팅은 rep stosd 호출을 위한 값 셋팅이다.
rep - ecx
stosd - eax, edi
이런식으로 연결된다고 보면 된다.
rep -> ecx값 만큼 반복적으로 명령을 수행
stosd -> eax에 담긴 값을 edi에 복사함
stosd의 경우에는 이런 계통 명령어가 그렇듯 stosb(1Byte), stosw(2Bytes), stosd(4Bytes)명령어중
4Bytes를 복사하는 명령어이다.
stosd명령어가 edi가 가리키는 곳에 eax에 담긴 4Bytes값을 복사하면 edi는 그 뒷 주소를 가리키게 되고
rep명령어에 의해 ecx 즉 count값이 0이 될때까지 이를 반복하기 때문에 memset과 같은 기능을 하게 된다.
--------------------------------------------------------------------------------------------
아직 SIMD등 병렬적인 처리가 되는 부분은 익숙하지 않아서
적용해 보지 못했지만 어셈블리어를 다시 공부하면서 적용해 보려고 한다.
반응형
'프로그래밍 > 어셈블리어' 카테고리의 다른 글
SIMD를 이용한 수학 라이브러리 만들기 - 3. Vector 클래스 (0) | 2011.11.11 |
---|---|
SIMD를 이용한 수학 라이브러리 만들기 - 2. CPU 식별하기 (0) | 2011.11.10 |
SIMD를 이용한 수학 라이브러리 만들기 - 1. SIMD란? (0) | 2011.11.07 |