x64 아키텍처

x64 아키텍처는 x86의 이전 버전과 호환되는 확장입니다. x86과 동일한 새로운 64비트 모드와 레거시 32비트 모드를 제공합니다.

"x64"라는 용어에는 AMD 64 및 Intel64가 모두 포함됩니다. 명령 집합은 거의 동일합니다.

레지스터

x64는 x86의 8개 범용 레지스터를 64비트로 확장하고 8개의 새로운 64비트 레지스터를 추가합니다. 64비트 레지스터에는 "r"으로 시작하는 이름이 있습니다. 예를 들어 eax 의 64비트 확장을 rax라고 합니다. 새 레지스터의 이름은 r8 부터 r15까지입니다.

각 레지스터의 하위 32비트, 16비트 및 8비트는 피연산자에서 직접 주소 지정이 가능합니다. 여기에는 esi와 같은 레지스터가 포함되며, 하위 8비트에서는 이전에 주소를 지정하지 못했습니다. 다음 표에서는 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 동작과 호환됨).

높은 8비트 ax, bx, cxdx여전히 ah, bh, ch, dh 로 주소를 지정할 수 있지만 모든 유형의 피연산자와 함께 사용할 수는 없습니다.

명령 포인터 플래그 레지스터는 각각 64비트(riprflags)로 확장되었습니다.

또한 x64 프로세서는 다음과 같은 여러 부동 소수점 레지스터 집합을 제공합니다.

  • 80비트 x87 레지스터 8개.

  • 64비트 MMX 레지스터 8개. (이러한 레지스터는 x87 레지스터와 겹칩니다.)

  • 8개의 128비트 SSE 레지스터의 원래 집합이 16개로 증가합니다.

호출 규칙

x86과 달리 C/C++ 컴파일러는 x64에서 하나의 호출 규칙만 지원합니다. 이 호출 규칙은 x64에서 사용할 수 있는 증가된 레지스터 수를 활용합니다.

  • 처음 4개의 정수 또는 포인터 매개 변수는 rcx, rdx, r8r9 레지스터에 전달됩니다.

  • 처음 4개의 부동 소수점 매개 변수는 처음 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비트 레지스터로 처리됩니다.

추가 정보