x86-64 아키텍처란?
x86 아키텍처와 호환되는 64비트 아키텍처이다.
1999년에 AMD에서 발표한 ADM64의 시작으로 인텔을 비롯한 다양한 회사에서 이를 기반으로 다양한 이름의 아키텍처를 발표하였다. 이로 인해 범용적으로 불리는 x86-64 아키텍처라는 명칭이 탄생하게 되었고 현재 대다수의 컴퓨터는 x86-64 아키텍처 기반의 CPU를 가지고 있다.
x86-64 == Intel64, IA-32e, AMD64, EM64T
레지스터
레지스터는 기억장치의 데이터 교환속도 보다 빠른 CPU의 연산속도를 도와주기 위해 CPU에 있으며 데이터를 빠르게 저장하고 사용게 도와줍니다. 주로 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등에 사용됩니다.
종류로는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플레그 레지스터가 있다.
범용 레지스터
범용 레지스터는 연산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등 다양한 용도로 사용되는 다목적 레지스터이다. 종류는 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, EIP 가 있다.
x86-64에서는 총 8바이트까지 저장할 수 있다.
- RAX (Accumulator Register, 누산기 레지스터)
산술, 논리 연산을 담당하는 레지스터로, 함수의 반환값이 이 레지스터에 저장된다.
- RAX 레지스터의 종류
- RAX: 64비트 (x86-64 아키텍처에서의 확장된 EAX)
- EAX: 32비트 누산기 레지스터
- AX: 16비트의 EAX 레지스터 하위 부분
- AH: AX의 상위 8비트
- AL: AX의 하위 8비트
- RAX 레지스터의 종류
- RBX (Base Register, 베이스 레지스터) 메모리 주소를 저장하기 위해 사용되는 레지스터.
종종 배열이나 문자열과 같은 데이터 구조에 접근하기 위한 기준 포인터로 사용된다.
- RBX 레지스터의 종류
- RBX: 64비트 (x86-64 아키텍처에서의 확장된 EBX)
- EBX: 32비트 베이스 레지스터
- BX: 16비트의 EBX 레지스터 하위 부분
- BH: BX의 상위 8비트
- BL: BX의 하위 8비트
- RBX 레지스터의 종류
- RCX (Count Register, 카운트 레지스터)
반복 작업에서 카운터 역할을 수행하는 레지스터이다.
loop 명령어 사용 시 레지스터의 값을 하나씩 감소시키며, 0이 될 때까지 반복 작업을 수행한다.
- RCX 레지스터의 종류
- RCX: 64비트 (x86-64 아키텍처에서의 확장된 ECX)
- ECX: 32비트 카운트 레지스터
- CX: 16비트의 ECX 레지스터 하위 부분
- CH: CX의 상위 8비트
- CL: CX의 하위 8비트
- RCX 레지스터의 종류
- RDX (Data Register, 데이터 레지스터)
EAX 레지스터와 함께 사용하여 큰 수를 연산을 하거나, 그 결과를 저장할 수 있는 레지스터이다.
64bit 더블워드 연산을 수행할 때에도 사용 가능하다. (div, mul)
- RDX 레지스터의 종류
- RDX: 64비트 (x86-64 아키텍처에서의 확장된 EDX)
- EDX: 32비트 데이터 레지스터
- DX: 16비트의 EDX 레지스터 하위 부분
- DH: DX의 상위 8비트
- DL: DX의 하위 8비트
- RDX 레지스터의 종류
세그먼트 레지스터
x86 아키텍처에서 메모리를 세그먼트 단위로 접근하는데 각 세그먼트에 대한 기준 주소를 저장하고 서그멘트를 이용하여 물리 메모리를 효율적으로 사용하게 하는 특수한 레지스터
종류로는 CS, DS, SS, ES, FS, GS가 있다.
- CS (Code Segment) : 현재 프로그램의 실행할 코드의 시작 주소가 저장되는 레지스터
- DS (Data Segment) : 데이터가 포함된 세그먼트의 주소,즉 프로그램에 지정된 데이터 영역의 시작 주소가 저장되는 레지스터
- SS (Stack Segment) : 스택 영역의 시작 주소가 저장되는 레지스터
- ES, FS, GS : 추가적인 데이터, 범용적으로 사용
명령어 포인터 레지스터
다음에 실행될 명령의 메모리 주소를 저장하여 어느 부분의 코드를 실행할지 가리키는 레지스터
종류로는 RIP가 있다.
플래그 레지스터
CPU가 연산을 수행한 후 결과를 저장하는 레지스터
특정 연산 후 조건을 판단하는데 사용되며 특히 조건문, 인터럽트 등에 활용
종류는 20여개 정도지만 주로 사용되는 것은 CF, ZF, SF, OF 등이 있다.
- CF (Carry Flag) : 부호가 없는 수의 연산 결과가 비트의 범위를 넘을 경우 사용
- ZF (Zero Flag) : 연산 결과가 0일 경우 사용
- OF (Overflow Flag) : 부호가 있는 수의 연산 결과가 비트의 범위를 넘을 경우 사용
- SF (Sign Flag) : 연산의 결과가 음수일 경우 사용