2009-11-23 39 views
7

? Tengo que perder el tiempo con las pilas en esta arquitectura y realmente soy un n00b aquí. Cualquier sugerencia para leer temas/búsquedas en google que pueda hacer. Estoy buscando cómo estas arquitecturas son fundamentalmente diferentes entre sí. algo más de un artículo de Wikipedia sobre este tema http://en.wikipedia.org/wiki/X64¿En qué se diferencia la arquitectura x64 de x86

+2

¿Qué necesitas saber exactamente? Hay muchas diferencias, algunas que solo son relevantes si está escribiendo un gestor de arranque, algunas que son relevantes si está escribiendo un sistema operativo o un controlador, y algunas que son relevantes si desea acelerar su código, o está escribiendo una función en ensamblaje – jalf

+0

@jalf Ya ha indicado que está buscando hacer algo funky con stacks que no haya sido expuesto por C. Para su caso particular, tal vez sea legítimo y tal vez no, pero en un contexto más amplio: por qué una actitud anti-aprendizaje? Él está tratando de aumentar sus habilidades en un área. Si estuviera aprendiendo un nuevo lenguaje de nivel superior, ¿estaría diciendo "bah, ese es un área de nicho, realmente no quieres hacer eso"? – asveikau

+0

Me gustaría dar crédito a jalf por querer enfocar la pregunta en la dirección que necesita Scott J, y no por desalentar la pregunta. –

Respuesta

0

Todos los registros en la CPU de x86 son de 32 bits en tanto que para 64-Bit Bit sus 64 :)

Si usando arithematic puntero a continuación, sizeof() dará resultados diferentes y también lo hará una operación incrmentada.

Creo que puede obtener información detallada sobre el sitio de Intel sobre las dos arquitecturas y también el conjunto de instrucciones destacando nuevas instrucciones agregadas con procesadores de 64 bits.

+0

En realidad, en x86 tiene registros de propósito general de 32 bits, 16 bits y 8 bits. Además de eso, tiene 8 registros MMX de 64 bits y 8 registros SSE de 128 bits. En x64 tiene todo eso más: todos los registros de 32 bits se pueden ampliar a 64 bits, tiene 8 GPR más y 8 registros SSE más. –

1

Para empezar el tamaño de un puntero es de 8 bytes en lugar de 4.

registros pueden contener valores de 64 bits también.

También a menudo hay muchas diferencias en el nivel del sistema operativo. Por ejemplo, en Windows tiene cosas como la redirección del sistema de archivos y la redirección del registro (WOW64) cuando ejecuta aplicaciones de 32 bits en un sistema operativo Windows de 64 bits.

+0

Básicamente, el tamaño de la palabra es de 8 bytes en lugar de 4 bytes. Esto solo da como resultado muchas diferencias. El ensamblaje x64 es algo diferente al ensamblaje x86 (diferentes nombres de registro, etc.) –

+0

También hay más GPR. – Joey

3

Creo que el artículo de Wikipedia al que vinculó proporciona una cantidad razonable de información introductoria. Si está interesado en los detalles específicos de las diferencias en el modo largo, puede consultar una de las referencias oficiales: Intel® 64 and IA-32 Architectures Software Developer's Manuals.

9

En x86 hay 8 registros de 32 bits, en x64 los registros son de 64 bits cada uno y hay 8 más. Los registros SSE de 128 bits son 128 bits en ambos, pero en x86 hay 8, mientras que en x64 hay 16. También se cortaron algunas instrucciones en x64.

En modo x64, puede utilizar los registros como 32 bits utilizando su nombre de 32 bits (comenzando con una 'e') en lugar de su nombre de 64 bits (comenzando con 'r'), y el ensamblaje sería casi lo mismo.

http://en.wikipedia.org/wiki/X86#x86_registers

O si quieres un poco de lectura muy pesado (como el 1000 de páginas ...)

http://www.intel.com/products/processor/manuals/index.htm He leído a través de unos pocos cientos de páginas de los manuales y hemos aprendido mucho, bueno de verdad .

+1

+1 para leer esa página 1000;) – Rev

0

Además del hecho de que los registros de propósito general ahora son 64 bits en lugar de 32, también hay nuevos registros: r8, r9, r10, r11, r12, r13, r14 y r15. El hecho de que haya más registros también lleva al hecho de que la mayoría de los compiladores usan convenciones de llamadas de registro por pasadas para llamadas a funciones (excepto aquellas con varargs), mientras que en x86 la mayoría de los compiladores envían todos los argumentos a la pila.

La FPU x87 también está en desuso, prefiriendo SSE.

+0

La FPU x87 está disponible en x86-64 como en x86. Puede usarlo igual que solía hacerlo. –

+0

Está disponible, seguro, pero marcado como obsoleto. Desde AMD: "A pesar de su largo servicio en arquitectura x86, la aritmética x87 está obsoleta en el modo de 64 bits". http://developer.amd.com/documentation/articles/pages/62720069.aspx – asveikau

+0

hmm ... Entonces debo estar malentendiendo lo que significa "desaprobado" :-). ¿Qué significa eso? –

0

Aunque no creo que sea específicamente una respuesta x86 contra x64, puede ser relevante.

En Linux, en x86 la pila es 4k u 8k, mientras que en x64 es 16k.

2

Um, stack? ¿Te refieres a la pila física (E/RSP)?Si es así, mi respuesta es relevante:

En x86, casi todos los compiladores de C usan el estándar de llamadas cdecl. No recuerdo los detalles, pero fue consistente entre compiladores y sistemas operativos. Básicamente, los argumentos se envían a la pila (de derecha a izquierda) y luego el valor de retorno se coloca en eax y la persona que llama es responsable de la limpieza.

En x86-64 sin embargo, todo es bastante jodido. La convención de llamadas de Windows es diferente de Linux (la mayoría de los sistemas operativos tipo no-linux de Linux se han mantenido con el estándar original de llamadas C, lo que lleva a una mayor perplejidad). No recuerdo cómo difieren, pero lo hacen. Busque "convenciones de llamadas diferentes x86-64" en google y encontrará los detalles.

ver: http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention

8

Todas las respuestas aquí mencionar los cambios en el conjunto de registros, que voy a enumerar aquí para completar:

  • Todos los registros existentes de propósito general de 32 bits se extendían a 64 bits (EAX se extiende a RAX y así sucesivamente)
  • 8 nuevos registros de propósito general de 64 bits (R8 través de R15)
  • 8 nuevo 128-b Se registra a través de la ESS (XMM8XMM15)

También hay cambios en los modos de direccionamiento:

  • CS, DS, ES y SS son planas. Es decir, su base es 0x0 y su límite es 0xffffffffffffffff. FS y GS pueden tener una base de más de 32 bits.
  • Los descriptores en GDT, LDT e IDT han cambiado. Tienen 8 bytes en el modo de 64 bits
  • Un espacio de direcciones no contiguas. En el modo de 32 bits, el espacio de direcciones lineales es de 0x0 a 0xfffffff. En el modo de 64 bits, el espacio de direcciones lineales se divide de 0x0 a 0x00007ffffffff y de 0xffff800000000000 a 0xffffffffffffffff. Básicamente, solo hay 48 bits de dirección y la dirección se extiende a 64 bits.
  • Un nuevo modo de paginación.

diversas instrucciones se eliminaron:

  • Un byte INC instrucciones con codificación 40+rw y 40+rd. El byte 4x se convirtió en el REX prefijo.
  • instrucciones para cargar los registros de segmento que ahora son planos: LDS, LDS, LSS.

Hay más diferencias que simplemente puedo recordar de la parte superior de mi cabeza. Los agregaré si puedo pensar en algo más.

+1

+1: respuesta más completa – greyfade

1

Una cosa que la gente no mencionó es el direccionamiento, en el modo protegido de 32 bits los registros de segmentos tienen un significado y los SS DS y CS pueden tener cada uno un desplazamiento diferente. En el modo protegido de 64 bits eso no puede suceder. Los únicos registros que pueden tener un desplazamiento (pero sin límite) son FS y GS.Lo que significa que en el modo de 32 bits ds: [ebx] y cs: [ebx] pueden tener un valor diferente que permite algo de maldad. Pero generalmente los sistemas operativos no hacen esto.

Otra cosa que la gente no mencionó aquí es que si modifica un registro de 32 bits en el modo de 64 bits se borrará la mitad superior, pero solo si modifica los 32 bits. p.ej. mov eax, 0 dará como resultado que rax sea 0, mientras que mov ax, 0 no tocará la mitad superior. Por lo tanto, es un poco complicado cuando se mira ensamblaje.

En cuanto a la pila, es más una cuestión de sistema operativo que la CPU. La ventana ABI para x64 es diferente de la utilizada por todos los demás (linux, mac ...). Probablemente necesites mirar más profundamente las "convenciones de llamadas" y los ABI (interfaz binaria de la aplicación). Sin embargo, en x64, el RSP debe estar alineado 16 bytes en la entrada de una función, por lo que a menudo verá reducciones dummy rsp. Esto es para asegurarse de que los valores de 16 bytes en la pila estén siempre alineados. Pero a nivel de la CPU todo es lo mismo, los decrementos RSP, push sigue siendo "sp- = word_size; ram [sp] = value". Ah, y en x64 RSP no tiene un límite, en x32 puedes decirle a la CPU que el puntero de la pila no puede ir por debajo de cierta dirección, por lo que el acceso a las direcciones más bajas provocará un error.

No estoy seguro de lo que está preguntando exactamente. Tal vez una pregunta más específica permitiría una respuesta más específica.

Cuestiones relacionadas