x64 레지스터들은 8개의 범용 레지스터와 8개의 추가 레지스터들을 합하여 16개의 레지스터로 이루어진다.
범용 레지스터 RAX / RBX / RCX / RDX
이 레지스터들은 함수 계산을 할 때 주로 사용되는 레지스터들로 RAX는 주로 함수의 리턴 값을 저장한다.
RBX는 RSI/RDI와 연계하여 기준 주소의 오프셋을 나타내는 값을 저장한다.
RCX는 for,while 문에서 자주 사용되는 반복 횟수가 저장된다.
RDX는 RAX와 같이 데이터나 주소 등 여러 범용으로 사용된다.
스택 포인터 레지스터 RBP / RSP
RBP : 스택 메모리의 시작 주소를 저장한다.
RSP : 증가하는 스택 메모리의 끝 주소를 저장한다.
인덱스 레지스터 RSI / RDI
복사나 비교의 대상이 자주 되는 기준 출발/목적지 주소를 저장한다.
인스트럭션 포인터 레지스터 RIP
다음 명령어의 위치를 저장한다.
E-플래그 레지스터 EFL
CPU의 상태를 나타내는 레지스터이다. 아키텍쳐마다 사용하는 비트와 의미가 다를 수 있지만 주로 중간 계산 결과에 대한 CPU 상태를 반영한다.
추가 레지스터 R8-R15
x64 아키텍쳐에 추가되는 레지스터들로 용도가 다양하다.
Calling Convention
x64의 호출 규약
- 첫 네 개의 정수나 포인터 주소는 RCX,RDX,R8,R9 레지스터들에 저장된다.
- 첫 네 개의 부동소수점 인수들은 xmm0-xmm3 레지스터들에 저장된다.
- 호출 함수는 지역 변수에 해당하는 값들을 레지스터로 전달해 호출할 수 있으며 피호출 함수가 레지스터를 사용함으로써 이 값들을 변경할 수 있게된다.
- 추가 인자들이 스택에 전달될 수 있다.
- 반환되는 정수 값 혹은 포인터 주소는 RAX에 저장되며 반환되는 부동소수점은 xmm0에 저장된다.
- RAX, RCX, RDX, R8-R11 레지스터들은 휘발성이다.
- RBX, RBP, RDI, RSI, R12-R15 레지스터들은 비휘발성이다. (고정되어 있다.)
C++ 호출 규약
this 포인터가 주소값으로 첫 인자로써 전달되며 첫 3개의 인자는 레지스터 나머지는 스택에 저장된다.
참고 자료
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/x64-architecture
'개발 > 개발 노트' 카테고리의 다른 글
VirtualBox에서 인터넷 사이트 DNS 접속 오류 (0) | 2022.05.08 |
---|---|
REST API (0) | 2022.04.30 |
Base64 변환 인코딩 (0) | 2022.04.05 |
C++ UnitTest 프로젝트 만들기 (0) | 2022.01.30 |