Compartir a través de


Arquitectura x64

La arquitectura x64 es una extensión compatible con versiones anteriores de x86 que proporciona un nuevo modo de 64 bits y un modo heredado de 32 bits idéntico a x86. Esta arquitectura amplía los ocho registros de uso general de x86 a 64 bits, agrega ocho nuevos registros y presenta convenciones de llamada mejoradas y modos de direccionamiento para la programación moderna de 64 bits.

El término "x64" incluye AMD64 e Intel 64. Los conjuntos de instrucciones son casi idénticos.

Registros

x64 amplía los ocho registros de uso general de x86 para que sean de 64 bits y agrega ocho registros de 64 bits nuevos. Los registros de 64 bits tienen nombres que comienzan por "r". Por ejemplo, la extensión de 64 bits de eax se denomina rax. Los nuevos registros se denominan r8 a r15.

Los 32 bits inferiores, 16 bits y 8 bits de cada registro son direccionables directamente en operandos. Esta direccionabilidad directa incluye registros como esi, cuyos 8 bits inferiores no eran direccionables anteriormente. En la tabla siguiente se especifican los nombres de lenguaje de ensamblado para las partes inferiores de los 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

Las operaciones que se producen en un subregistro de 32 bits se extienden automáticamente con ceros al registro completo de 64 bits. Las operaciones que generan salida en subregistros de 8 bits o 16 bits no realizan la extensión de ceros (este comportamiento es compatible con x86).

Los 8 bits altos de ax, bx, cx y dx siguen siendo direccionables como ah, bh, ch y dh , pero no se pueden usar con todos los tipos de operandos.

El registro eip y flags del puntero de instrucción se extienden a 64 bits (rip y rflags, respectivamente).

El procesador x64 también proporciona varios conjuntos de registros de punto flotante:

  • Ocho registros x87 de 80 bits.

  • Ocho registros MMX de 64 bits. (Estos registros se superponen con los registros x87).

  • El conjunto original de ocho registros SSE de 128 bits se incrementa a 16.

Convenciones de llamada

A diferencia de la arquitectura x86, el compilador de C/C++ solo admite una convención de llamada en x64. Esta convención de llamada aprovecha el mayor número de registros disponibles en x64:

  • Los cuatro primeros parámetros enteros o de puntero se pasan en los registros rcx, rdx, r8 y r9 .

  • Los cuatro primeros parámetros de punto flotante se pasan en los cuatro primeros registros SSE, xmm0-xmm3.

  • El llamador reserva espacio en la pila para los argumentos pasados en los registros. La función llamada puede usar este espacio para desbordar el contenido de los registros en la pila.

  • Se pasan otros argumentos en la pila.

  • Se devuelve un valor devuelto entero o puntero en el registro rax , mientras que se devuelve un valor devuelto de punto flotante en xmm0.

  • rax, rcx, rdx, r8-r11 son volátiles.

  • rbx, rbp, rdi, rsi, r12-r15 son no volátiles.

La convención de llamada para C++ es similar. Este puntero se pasa como primer parámetro implícito. Los tres parámetros siguientes se pasan en los registros restantes, mientras que el resto se pasa en la pila.

Modos de direccionamiento

Los modos de direccionamiento en modo de 64 bits son similares, pero no idénticos a x86.

  • Las instrucciones que hacen referencia a registros de 64 bits se realizan automáticamente con precisión de 64 bits. Por ejemplo, mov rax, [rbx] mueve 8 bytes a partir de rbx a rax.

  • Existe una forma especial de la instrucción mov para constantes inmediatas de 64 bits o direcciones constantes. Para todas las demás instrucciones, las constantes inmediatas o las direcciones constantes siguen siendo de 32 bits.

  • x64 proporciona un nuevo modo de direccionamiento relativo al rip. Instrucciones que hacen referencia a una única dirección constante se codifican como desplazamientos desde rip. Por ejemplo, la instrucción mov rax, [addr] mueve 8 bytes comenzando en addr + rip a rax.

Instrucciones, como jmp, call, push y pop, que hacen referencia implícitamente al puntero de instrucción y al puntero de pila, los tratan como registros de 64 bits en x64.