관리 메뉴

c0smicb0y

함수에서의 레지스터 사용 본문

프로그래밍/Windows

함수에서의 레지스터 사용

2015. 11. 4. 02:13

컴퓨터에서 수행되는 대부분의 연산은 레지스터를 이용하여 이루어지게 된다. 하지만 이 레지스터의 개수는 극히 제한적이기 때문에 함수 내에서 또 다른 함수 호출 시에는 레지스터간의 충돌을 고려해야한다.


우리가 사용하는 Windows의 컴파일러들은 이러한 문제를 피하기 위해 아래와 같은 규칙을 사용하여 함수들간의 레지스터 사용의 충돌을 피하고 있다.



 Platform 

 Caller-save 레지스터

 Callee-save 레지스터

 x86 Windows

 EAX, ECX, EDX, 

 ST(0)~ST(7), XMM0~XMM7

 EBX, ESI, EDI, EBP

 x64 Windows

 RAX, RCX, RDX, R8~R11,

 ST(0)~ST(7), XMM0~XMM5,

 High half of XMM6~XMM15

 RBX, RSI, RDI, RBP, R12~R15,

 XMM6~XMM15


Caller-save 레지스터(scratch 레지스터 혹은 volatile 레지스터라고 부르기도 함)는 함수 내에서 어떠한 임시적 저장 없이 마음대로 쓸 수 있는 레지스터로서, 레지스터의 사용이 이를 호출한 이전 함수에 어떠한 영향도 미치지 않는 레지스터들이다.


Callee-save 레지스터는 이를 호출한 함수에 영향을 미칠 수 있기 때문에 해당 레지스터를 사용하기 전에 반드시 저장을 하여 놓고 사용해야 하는 레지스터 들이며, 해당 함수가 끝났을 때에는 반드시 이전 값으로 되돌려 주어 이 함수를 호출한 함수에 어떠한 영향을 미쳐서도 안 되는 레지스터들이다.

'프로그래밍 > Windows' 카테고리의 다른 글

Child Process를 디버깅하는 방법  (0) 2015.11.21
VC 컴파일러 환경 변수 설정  (0) 2015.11.13
Calling Convention (호출규약)  (0) 2015.11.04
ShellExecute vs CreateProcess  (0) 2015.10.02
Comments