Compartilhar via


Arquitetura x64

A arquitetura x64 é uma extensão compatível com versões anteriores do x86 que fornece um novo modo de 64 bits e um modo herdado de 32 bits idêntico ao x86. Essa arquitetura estende os oito registros de uso geral do x86 para 64 bits, adiciona oito novos registros e apresenta convenções de chamada aprimoradas e modos de endereçamento para programação moderna de 64 bits.

O termo "x64" inclui AMD64 e Intel 64. Os conjuntos de instruções são quase idênticos.

Registros

X64 estende os oito registros de uso geral do x86 para 64 bits e adiciona oito novos registros de 64 bits. Os registros de 64 bits têm nomes que começam com "r". Por exemplo, a extensão de 64 bits do eax chama-se rax. Os novos registros são nomeados r8 a r15.

Os 32 bits inferiores, 16 bits e 8 bits de cada registro são diretamente endereçáveis em operandos. Esse endereçamento direto agora inclui registros como esi, cujos 8 bits inferiores antes não eram endereçáveis. A tabela a seguir especifica os nomes na linguagem assembly para as porções inferiores dos registros de 64 bits.

Registro de 64 bits 32 bits inferiores 16 bits inferiores Menor correção de 8 bits
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

As operações que têm como saída um subregistro de 32 bits estendem-se automaticamente a zero para todo o registro de 64 bits. As operações que geram subregistros de 8 bits ou 16 bits não são estendidas para zero (esse comportamento é compatível com x86).

Os 8 bits altos de ax, bx, cx e dx ainda são endereçáveis como ah, bh, ch e dh , mas não podem ser usados com todos os tipos de operandos.

O eip do ponteiro de instrução e o registro de sinalizadores são estendidos para 64 bits (rip e rflags, respectivamente).

O processador x64 também fornece vários conjuntos de registros de ponto flutuante:

  • Oito registros x87 de 80 bits.

  • Oito registros MMX de 64 bits. (Esses registros se sobrepõem aos registros x87.)

  • O conjunto original de oito registros SSE de 128 bits é aumentado para 16.

Convenções de chamada

Ao contrário da arquitetura x86, o compilador C/C++ dá suporte a apenas uma convenção de chamada no x64. Essa convenção de chamada aproveita o aumento do número de registros disponíveis no x64:

  • Os quatro primeiros parâmetros inteiros ou de ponteiro são passados nos registros rcx, rdx, r8 e r9 .

  • Os quatro primeiros parâmetros de ponto flutuante são passados nos quatro primeiros registros SSE, xmm0-xmm3.

  • O chamador reserva espaço na pilha para argumentos passados em registros. A função chamada pode usar esse espaço para transferir o conteúdo dos registros para a stack.

  • Você passa qualquer outro argumento na pilha.

  • Um valor de retorno inteiro ou ponteiro é retornado no registro rax , enquanto um valor de retorno de ponto flutuante é retornado em xmm0.

  • rax, rcx, rdx, r8-r11 são voláteis.

  • rbx, rbp, rdi, rsi, r12-r15 são nãovolatile.

A convenção de chamada para C++ é semelhante. O ponteiro this é passado como um primeiro parâmetro implícito. Os próximos três parâmetros são passados em registros restantes, enquanto o restante é passado na pilha.

Modos de endereçamento

Os modos de endereçamento no modo de 64 bits são semelhantes, mas não idênticos ao x86.

  • Instruções referentes a registros de 64 bits são executadas automaticamente com precisão de 64 bits. Por exemplo, mov rax, [rbx] move 8 bytes começando em rbx para rax.

  • Existe uma forma especial da instrução mov para constantes imediatas de 64 bits ou endereços constantes. Para todas as outras instruções, constantes imediatas ou endereços constantes ainda são de 32 bits.

  • O x64 fornece um novo modo de endereçamento relativo a rip. Instruções que se referem a um único endereço constante são codificadas como deslocamentos a partir de rip. Por exemplo, a instrução mov rax, [addr] move 8 bytes começando no endereço + rip para rax.

Instruções, como jmp, call, push e pop, que se referem implicitamente ao ponteiro de instrução e ao ponteiro de pilha tratam-nas como registros de 64 bits no x64.