개발/개발 노트

x64 아키텍쳐 레지스터

로파이 2022. 4. 21. 22:48

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 상태를 반영한다.

https://en.wikipedia.org/wiki/FLAGS_register

추가 레지스터 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