반응형
어셈블리어를 다시 공부하려고 한다.

처음부터 정리도 해보겠지만 일단 지금 당장 사용할 수 있는 간단한 내용이 있어서 정리한다.

--------------------------------------------------------------------------------------------

소프트웨어 렌더링을 하다가 화면을 배경색으로 덮어주는 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등 병렬적인 처리가 되는 부분은 익숙하지 않아서

적용해 보지 못했지만 어셈블리어를 다시 공부하면서 적용해 보려고 한다.
반응형
Posted by msparkms
,