2009-11-18 27 views
40

¿Dónde puedo encontrar los nombres de los nuevos registros para ensamblar en esta arquitectura?¿Cuáles son los nombres de los nuevos registros de procesadores X86_64?

Me refiero a los registros en X86 como EAX, ESP, EBX, etc. Pero me gustaría tenerlos en 64 bits.

No creo que sean los mismos que cuando desarmo mi código C, obtengo r's en lugar de e.

+0

Guys ¿Cómo se puede comprobar qué registros se correlacionan con parámetros cuando se hace una llamada al sistema. He estado leyendo y documentando y no he encontrado una respuesta clara. – Recursion

+0

Tenga en cuenta que los registros superiores de 8 bits superiores (ah, bh, etc.) ya no funcionan para todos los códigos de operación. p.ej. 'inc ah' no es válido en x64 porque ese código de operación se ha reutilizado para uno de los nuevos registros de 64 bits. – Johan

+1

@Johan: también tenga en cuenta que con el prefijo REX, los códigos de registro para ah bh ch dh se convierten en los nuevos registros de bytes sil dil bpl spl –

Respuesta

57

Los antiguos registros de 32 bits se han extendido a 64 bits, los r registros (rax, rbx, rsp y así sucesivamente).

Además, hay algo de propósito general adicional registra r8 través r15 que también se puede acceder como (por ejemplo) r8d, r8w y r8b (la inferior de 32 bits de palabra doble, palabra de 16 bits y 8 bits byte respectivamente).

El byte alto de los viejos registros de 16 bits sigue siendo accesible, en muchas circunstancias, como ah, bh, y así sucesivamente, pero esto no parece ser el caso de los r8 través r15 registros. Hay algunas nuevas codificaciones de instrucciones , específicamente aquellas que usan el prefijo REX, que no pueden acceder a esos bytes altos, pero otras aún son libres de usarlas.

Además, hay algunos nuevos registros de SSE, xmm8 aunque xmm15.

Los registros eip y flags también se han extendido a rip y rflags.

Consulte wikipedia page y MSDN para obtener más información.

Si esto es compatible con la palabra clave asm para un compilador de C en particular, no podría decirlo. Lo poco ensamblaje yo (y se está convirtiendo en aproximadamente un día al año) se realiza en el montaje en lugar de C.

+0

¿qué significa "R"? –

+24

@ int80, no tengo idea. Quizás 'e' significa extendido y' r' significa _really_ extendido :-) – paxdiablo

+1

sé que "e" significa extendido (de 16 bits). pero r? pero su respuesta es solo lógica%) –

8

X64 extiende los registros de propósito general de 32 bits de la siguiente manera:

EAX -> RAX 
EBX -> RBX 
ECX -> RCX 
EDX -> RDX 
ESI -> RSI 
EDI -> RDI 
ESP -> RSP 
EBP -> RBP 

X64 también añade la siguientes 64 bits registros de propósito general:

R8, R9, R10, R11, R12, R13, R14, R15 

Además, SSE es parte de la especificación X64, por lo que los registros vectoriales xmm0-xmm15 están disponibles, así

Puede encontrar información básica sobre la arquitectura en Wikipedia/X86-64 o ir al sitio web de Intel.

79

El MSDN documentation incluye información acerca de los registros x64.

64 se extiende 8 de propósito general registros de 64 bits a ser de 64 bits, y añade 8 nuevos registros de 64 bits. Los registros de 64 bits tienen nombres que comienzan con "r", por lo que para ejemplo, la extensión de 64 bits de eax es llamada rax. Los nuevos registros son llamados r8 a r15.

Los 32 bits inferiores, 16 bits y 8 bits de cada registro son directamente direccionables en operandos. Esto incluye registros , como esi, cuyos bits inferiores 8 no eran previamente direccionables. La siguiente tabla especifica los nombres de lenguaje de ensamblado para las partes más bajas de de los registros de 64 bits.

64-bit register | Lower 32 bits | Lower 16 bits | Lower 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 
+0

Esto es claro, pero el modo de 8 bits inferior parece no válido para 'r8' ~' r15' en mi CPU Intel x86-64, aunque funciona para los otros 8 registros de propósito general. También el soporte 'rax' ~' rdx' para acceder a los 8 bits en el modo 'alto', significa acceder a los 8 bits más significativos del modo de 16 bits, usando' ah' ~ 'dh'. –

+0

@EricWang: ¿Intentó utilizar 'mov ah, r8b' o algo así? No puede usar un registro de alto 8 con un prefijo REX. 'REX mov ah, 0' es' mov spl, 0', y así sucesivamente (las codificaciones para 'AH/CH/DH/BH' significan 'spl/bpl/sil/dil' cuando hay un prefijo REX (en ese orden) en código de máquina) –

4

¿Dónde puedo encontrar los nombres de los nuevos registros para el montaje de esta arquitectura.

En el manual del procesador "Intel 64 e IA-32 Arquitecturas de Software Manual del desarrollador Volumen 1: Arquitectura básica", por ejemplo, version 253665-053US:

  • búsqueda de "registros"
  • el primer partido es el índice "3.4 PROGRAMA BÁSICO DE EJECUCIÓN REGISTRO"
  • dos artículos siguientes "3.4.1.1 Registros de uso general en modo de 64 bits"

En esa sección:

si se especifica un tamaño del operando de 64 bits: RAX, RBX, RCX, RD X, RDI, RSI, RBP, RSP, R8-R15 están disponibles. R8D-R 15D/R8-R15 representan ocho nuevos registros de propósito general.

Recordatorio: el modo de 64 bits es el modo "normal" en x86-64. El otro modo principal es el "modo de compatibilidad" que emula IA32.

Si se mantiene la búsqueda de "registro" en la tabla de contenido, también puede encontrar secciones sobre "el número de trituración" registros de punto flotante SIMD y dispersos en el manual:

  • 8.1.2 - x87 FPU de Datos registros (STX)
  • 9.9.2 - MMX registros
  • 10.2.2 - XMM registradoras
  • 14.1.1 - 256-bit de ancho SIMD Registro Soporte (YMM)

Hay muchos más registros de control que tienen varios efectos secundarios y generalmente no se pueden escribir a menos que desee esos efectos (y a menudo requieren el anillo 0). Estos se resumen en la "Guía de programación del sistema del Volumen 3 - 2.1.6 Registros del sistema", que es más para los desarrolladores de SO.

Una buena aproximación empírica es ejecutar info all-registers en GDB: How to print register values in gdb?

Cuestiones relacionadas