Arquitetura x64

A arquitetura x64 é uma extensão compatível com versões anteriores do x86. Ele fornece um novo modo de 64 bits e um modo herdado de 32 bits, que é idêntico ao x86.

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

Registros

X64 estende os 8 registros de uso geral do x86 para 64 bits e adiciona 8 novos registros de 64 bits. Os registros de 64 bits têm nomes começando com "r". Por exemplo, a extensão de 64 bits do eax é chamada de rax. Os novos registros são nomeados r8 a r15.

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

Registro de 64 bits 32 bits inferiores 16 bits inferiores 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 são geradas para um subregistro de 32 bits são automaticamente estendidas por zero para todo o registro de 64 bits. As operações que são geradas para subregisores de 8 bits ou 16 bits não são estendidas por zero (esse é um comportamento x86 compatível).

Os 8 bits altos de ax, bx, cx e dx ainda são endereçáveis como ah, bh, ch, 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 foram 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 dezesseis.

Convenções de chamada

Ao contrário do x86, o compilador C/C++ dá suporte apenas a uma convenção de chamada em 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 despejar o conteúdo dos registros na pilha.

  • Todos os argumentos adicionais são passados na pilha.

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

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

  • rbx, rbp, rdi, rsi, r12-r15 são não volátil.

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 que se referem 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.

  • Uma forma especial da instrução mov foi adicionada 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 de rip. Por exemplo, a instrução mov rax, [addr] move 8 bytes começando em 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 os tratam como registros de 64 bits em x64.

Confira também