본문 바로가기

backup

[SIMD 병렬 프로그래밍]범용 레지스터

SIMD 프로그래밍을 하기 위해선 C++ 코드 안에 어셈블리어로 구현을 하는데

아래와 같이

 

_asm{

 

}

 

안에 구현을 하게 된다.

 

여기서 eax, ebx 등은 지정된 값인데, 바로 범용 레지스터라고 하는 부분이다.

 

 

 

레지스터는 CPU에 바로 저장이 되는 영역으로 속도가 매우 빠른 반면 용량은 작다. 그 중에서 범용 레지스터는 연산을 위해서 쓰이는 부분들인데, 요즘의 CPU에서는 메모리에서 레지스터로 데이터를 불러와 연산을 하고 결과를 다시 메모리로 돌려보내게 된다.

 

비쥬얼 스튜디어에서 위와 같이 디버깅 과정에서 레지스터를 보려면 Debug > windows > registers

를 선택하면 된다.

 

각 범용레지스터는 그 역할이 있는데 그것은 다음과 같다.

 

- EAX(Accumulator Register)
 누산기 레지스터. 대부분의 입출력 및 산술, 논리 연산에 사용된다. 그 뿐 아니라 리턴값, 인터
 럽트 번호 지정시 자동으로 사용된다.

 

- EBX(Base Register)
 주로 주소 지정을 확장 할 때 사용되거나 초기 주소 지정 등을 위해 사용된다. 이 때 오프셋 주소
 가 되어 SI, DI 레지스터와 결합되어 사용된다.

 

- ECX(Count Register)
 카운트 레지스터. 어떤 명령을 반복(Loop와 같은...) 수행 할 경우 횟수를 지정하는데 사용된다.
 내부적으로 이 값을 루프 수 만큼 저장했다가 1씩 감소시켜 0이 되면 EFlags의 ZF를 셋팅시켜
 루프를 종료 시키는매커니즘을 가진다.

 

- EDX(Data Register)
  데이터 레지스터. EAX의 보조 누산기로 주로 사용되어 입출력 연산시 간접 주소 지정 연산
 시에는 보조값을 저장하는데 사용하기도 한다.

 

- EBP(Base Pointer)
  스택의 베이스 포인터로 사용된다. 스택에 저장되는 것은 함수 수행시 지역 데이터가 들어가는데
이 베이스 포인트가 스택에서 함수의 시작점(모듈의 시작값을 저장)이 된다. 이 EBP를 기준으로
 지역 변수 및 함수 인자 접근이 가능한 것이다. 스택 프레임 역시 이 레지스터로 나눌 수 있다.

 

- ESP(Stack Pointer)
  현재까지 사용된 스택의 위치를 저장하는데 사용되는 레지스터.
 
- ESI(Source index), EDI(Destination Index)
연산및 간접 주소 연산에 주로 사용되며 문자열 처리 시 자주 사용된다.