x64 아키텍처는 x86과 동일한 새로운 64비트 모드 및 레거시 32비트 모드를 제공하는 x86의 이전 버전과 호환되는 확장입니다. 이 아키텍처는 x86의 8개 범용 레지스터를 64비트로 확장하고, 8개의 새 레지스터를 추가하며, 최신 64비트 프로그래밍을 위한 향상된 호출 규칙 및 주소 지정 모드를 도입합니다.
"x64"라는 용어에는 AMD64와 Intel 64가 모두 포함됩니다. 명령 집합은 거의 동일합니다.
등록
x64는 x86의 8개의 범용 레지스터를 64비트로 확장하고 8개의 새로운 64비트 레지스터를 추가합니다. 64비트 레지스터에는 "r"로 시작하는 이름이 있습니다. 예를 들어 eax 의 64비트 확장을 rax라고합니다. 새 레지스터의 이름은 r8 부터 r15까지입니다.
각 레지스터의 하위 32비트, 16비트 및 8비트는 피연산자에서 직접 주소 지정이 가능합니다. 이 직접 주소 지정 가능성에는 이전에 주소 지정이 불가능했던 8비트 이하의 esi와 같은 레지스터가 포함됩니다. 다음 표에서는 64비트 레지스터의 하위 부분에 대한 어셈블리 언어 이름을 지정합니다.
| 64비트 레지스터 | 하위 32비트 | 하위 16비트 | 하위 8비트 수정 |
|---|---|---|---|
rax |
eax |
ax |
al |
rbx |
ebx |
bx |
bl |
rcx |
ecx |
cx |
cl |
rdx |
edx |
dx |
dl |
rsi |
esi |
si |
sil |
rdi |
edi |
di |
dil |
rbp |
ebp |
bp |
bpl |
rsp |
esp |
sp |
spl |
r8 |
r8d |
r8w |
r8b |
r9 |
r9d |
r9w |
r9b |
r10 |
r10d |
r10w |
r10b |
r11 |
r11d |
r11w |
r11b |
r12 |
r12d |
r12w |
r12b |
r13 |
r13d |
r13w |
r13b |
r14 |
r14d |
r14w |
r14b |
r15 |
r15d |
r15w |
r15b |
32비트 서브레지스터에 출력하는 작업은 자동으로 전체 64비트 레지스터로 0으로 확장됩니다. 8비트 또는 16비트 하위 등록으로 출력되는 작업은 0으로 확장되지 않습니다(이 동작은 x86과 호환됨).
ax, bx, cx 및 dx의 상위 8비트는 여전히 ah, bh, ch 및 dh로 주소를 지정할 수 있지만 모든 유형의 피연산자와 함께 사용할 수는 없습니다.
명령 포인터 eip 및 플래그 레지스터는 각각 64비트(rip 및 rflags)로 확장됩니다.
또한 x64 프로세서는 다음과 같은 여러 부동 소수점 레지스터 집합을 제공합니다.
80비트 x87 레지스터 8개.
64비트 MMX 레지스터 8개. (이러한 레지스터는 x87 레지스터와 겹칩니다.)
8개의 128비트 SSE 레지스터의 원래 집합이 16으로 증가했습니다.
호출 규칙
x86 아키텍처와 달리 C/C++ 컴파일러는 x64에서 하나의 호출 규칙만 지원합니다. 이 호출 규칙은 x64에서 사용할 수 있는 레지스터의 증가된 수를 활용합니다.
처음 4개의 정수 또는 포인터 매개 변수는 rcx, rdx, r8 및 r9 레지스터에 전달됩니다.
처음 네 개의 부동 소수점 매개 변수는 처음 4개의 SSE 레지스터인 xmm0-xmm3에 전달됩니다.
호출자는 레지스터에 전달된 인수에 대한 스택의 공간을 예약합니다. 호출된 함수는 이 공간을 사용하여 레지스터의 내용을 스택으로 분산할 수 있습니다.
스택에 다른 인수를 전달합니다.
정수 또는 포인터 반환 값은 rax 레지스터에서 반환되고 부동 소수점 반환 값은 xmm0에서 반환됩니다.
rax, rcx, rdx, r8-r11 은 휘발성입니다.
rbx, rbp, rdi, rsi, r12-r15 는 비휘발성입니다.
C++에 대한 호출 규칙도 비슷합니다. 이 포인터는 암시적 첫 번째 매개 변수로 전달됩니다. 나머지 세 매개 변수는 나머지 레지스터에 전달되고 나머지는 스택에 전달됩니다.
주소 지정 모드
64비트 모드의 주소 지정 모드는 x86과 유사하지만 동일하지는 않습니다.
64비트 레지스터를 참조하는 지침은 64비트 정밀도로 자동으로 수행됩니다. 예를 들어 mov rax, [rbx] 는 rbx 에서 시작하여 8바이트를 rax로 이동합니다.
64비트 즉시 상수 또는 상수 주소에 대해 특별한 형태의 mov 명령이 존재합니다. 다른 모든 지침의 경우 직속 상수 또는 상수 주소는 여전히 32비트입니다.
x64는 새 립 상대 주소 지정 모드를 제공합니다. 단일 상수 주소를 rip의 오프셋으로 인코딩하는 명령어입니다. 예를 들어 mov rax, [addr] 명령은 addr + rip 에서 시작하여 8바이트를 rax로 이동합니다.
명령 포인터와 스택 포인터를 암시적으로 참조하는 jmp, 호출, 푸시 및 팝과 같은 지침은 x64에서 64비트 레지스터로 처리합니다.