Partilhar 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 legado de 32 bits idêntico ao x86. Essa arquitetura estende os oito registradores de uso geral do x86 para 64 bits, adiciona oito novos registradores e introduz convenções de chamada e modos de endereçamento aprimorados 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.

Registos

O x64 estende os oito registradores de uso geral do x86 para 64 bits e adiciona oito novos registradores de 64 bits. Os registradores de 64 bits têm nomes que começam com "r". Por exemplo, a extensão de 64 bits do eax é chamada rax. Os novos registos são denominados r8 a r15.

Os 32 bits, 16 bits e 8 bits inferiores de cada registro são diretamente endereçáveis em operandos. Essa endereçabilidade direta inclui registradores como esi, cujos 8 bits inferiores não eram endereçáveis anteriormente. A tabela a seguir especifica os nomes em linguagem de assembly para as partes inferiores dos registradores de 64 bits.

Registo de 64 bits Inferior 32 bits Menos significativos 16 bits Corrigir os 8 bits inferiores
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 geram saída para um subregistro de 32 bits automaticamente se estendem para todo o registro de 64 bits. As operações que têm como saída subregistos de 8 bits ou 16 bits não efetuam extensão de 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 ponteiro de instruções eip e o registro de sinais flags são estendidos para 64 bits (rip e rflags, respectivamente).

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

  • Oito registradores x87 de 80 bits.

  • Oito registradores MMX de 64 bits. (Estes registos sobrepõem-se aos registos x87.)

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

Convenções de chamada

Ao contrário da arquitetura x86, o compilador C/C++ suporta apenas uma convenção de chamada em x64. Esta convenção de chamada aproveita o aumento do número de registos disponíveis em x64:

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

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

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

  • Você passa quaisquer outros argumentos 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 não são voláteis.

A convenção de chamada para C++ é semelhante. O ponteiro this é passado como um primeiro parâmetro implícito. Os três próximos parâmetros são passados em registros restantes, enquanto os demais são passados 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.

  • As instruções que se referem aos registradores 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.

  • x64 fornece um novo modo de endereçamento relativo a rip. As instruções que se referem a um único endereço constante são codificadas como deslocamentos do rip. Por exemplo, a instrução mov rax, [addr] transfere 8 bytes a partir de addr + 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 as tratam como registradores de 64 bits em x64.