? 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
Respuesta
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.
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. –
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.
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.) –
También hay más GPR. – Joey
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.
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 para leer esa página 1000;) – Rev
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.
La FPU x87 está disponible en x86-64 como en x86. Puede usarlo igual que solía hacerlo. –
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
hmm ... Entonces debo estar malentendiendo lo que significa "desaprobado" :-). ¿Qué significa eso? –
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.
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
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 aRAX
y así sucesivamente) - 8 nuevos registros de propósito general de 64 bits (
R8
través deR15
) - 8 nuevo 128-b Se registra a través de la ESS (
XMM8
XMM15
)
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 es0xffffffffffffffff
. 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
a0xfffffff
. En el modo de 64 bits, el espacio de direcciones lineales se divide de0x0
a0x00007ffffffff
y de0xffff800000000000
a0xffffffffffffffff
. 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ón40+rw
y40+rd
. El byte4x
se convirtió en elREX
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: respuesta más completa – greyfade
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.
- 1. Usando x64 dll en la aplicación x86
- 2. ¿Cuál es la diferencia entre x86 y x64
- 3. ¿Los chips x86/x64 todavía usan microprogramación?
- 4. Cargando ensamble x86 o x64
- 5. x86 Servicio de depurador remoto en x64
- 6. ¿Qué sucede en la arquitectura x86 cuando ocurre una interrupción?
- 7. ¿Puedo instalar Windbg x86/x64 en mi x64 WIN7?
- 8. Compilación para x86 y x64
- 9. Operador Mod (%) en x86 vs x64
- 10. Acceso COM x86 desde x64 .NET
- 11. TypeLoadException en x64, pero está bien en x86 con structlayouts
- 12. Depuración aplicación .NET x86 en Windows x64 en VS2008
- 13. ¿Por qué un .NET EXE, compilado como x86, se ejecuta como x64?
- 14. ¿Qué paquete redistribuible de VC++ se debe elegir (x86 o x64)?
- 15. Desarrollo de un sistema operativo para la arquitectura x86
- 16. conmutación masiva entre x64 x86 en proyectos de instalación
- 17. PresentationCore y WindowsBase dlls en ambos entornos x64 y x86
- 18. StackOverflowException lanzada en sistemas x64; funciona correctamente en x86
- 19. ¿Qué es la "UE" en la arquitectura x86? (calcula la dirección efectiva?)
- 20. Cuál es la mejor forma de programar contra la variabilidad x64 vs. x86 de powershell
- 21. Entity Framework gira mucho más lento en x64 vs x86
- 22. ¿Puede una aplicación x64 usar ensamblajes x86, y viceversa?
- 23. x86 instrucción CMP Diferencia
- 24. ¿Cómo puedo hacer que mi instalador VS2008 x86 instale ensamblajes x64 en x64?
- 25. ¿Puedo ejecutar Visual Studio 2008 x86 en Windows Vista x64?
- 26. Configurar ASP.NET para usar x86 en x64 Windows
- 27. Escribiendo ensamble x86 en un procesador x64 bit
- 28. ¿Se puede generar un valor hash x86 cuando se ejecuta en modo x64?
- 29. ¿Compila ambos x86 y x64 en una configuración?
- 30. Diferencias de TVarData entre x86 y x64 Delphi
¿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
@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
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. –