El C/C++ puede reemplazar al ASM?

Iniciado por x64core, 8 Marzo 2012, 00:58 AM

0 Miembros y 4 Visitantes están viendo este tema.

x64core

Hola buenas bueno viendo que al veces para hacer pruebas en codigos C/C++ necesito insetar codigo asm
y sabiendo que si inserto codigo asm en C mi codigo ya no es portable, esto quiere decir que solo se podra ejecutar
en la arquitectura de codigo asm que inserte verdad? entonces como puedo hacer para que se pueda ejecutar
en un x86 y en un x64 o es imposible :P
si es necesario leer bastante lo hare me interesaria aprender y saber si es posible ( y si lo es, como?) hacer aplicaciones
para x86 y x64 muchas gracias  :)

Eternal Idol

En (Windows) x64 los programas de 32 bits son emulados y los programas de 64 bits no funcionan en Windows de 32 bits.

Lo mejor que podes hacer es NO usar codigo en assembly, (casi) nunca es necesario y te advierto que el VC++ para x64 no permite inline assembly con lo cual vas a tener que usar un archivo .asm separado. De ultima usa compilacion condicional y genera dos binarios (uno de 32 y otro de 64 bits), C/C++ solo es multiplataforma compilando un binario para cada plataforma.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

~

Una máquina de 64 bits con un sistema de 64 bits puede ejecutar de forma nativa por las capacidades intrínsecas del CPU, tanto código de 32 bits como de 64 bits.

El código de 32 bits funcionando bajo modo de 64 bits es "Legacy Mode" (Modo de Compatibilidad), todos los CPUs de 64 bits son capaces nativamente de hacer esto.

Para pruebas de bajo nivel, el código de 64 bits tendría que ejecutarse solo en máquinas de 64 bits, o emular un CPU en modo de 64 bits usando instrucciones de 32 bits (relativamente fácil, aunque trabajoso, si solo nos limitamos a instrucciones determinadas y que preferiblemente no necesiten privilegios especiales -rings, etc.- y necesitamos leer detalladamente los manuales de CPUs de Intel y AMD para la especificación de las instrucciones a emular).

El código/programa de 32 bits puede usarse en un sistema de 64 bits sin problemas, desde el punto de vista simplemente del CPU y la aplicación de usuario.

Si se desea ejecutar un programa en el modo predeterminado y nativo del sistema, habría que crear 2 versiones del mismo programa, de 32 y 64 bits.

Es posible crear código fuente de ensamblador semiportable (usando macros, IFs de precompilador, etc., o algún lenguaje especial, o dejarle simplemente el trabajo a C/C++ si es adecuado para nuestras necesidades, usando un poco de Makefiles para cada versión, o una combinación de lo anterior).
Sitio web (si la siguiente imagen no aparece es porque está offline):

x64core


@Eternal Idol:
Genial siempre me entiendes Eternal, y pues mi cuestion por ahorita es que por ejemplo el registro FS no se puede
acceder desde C/C++ hay que usar inline assembly entonces por eso me cuestionada :P
y eso que dices sobre VC++ x64 sin Inline Assembly que fatal :S me has ahorrado un dolor de cabeza cuando tenga
una maquina x64 e instale VC++  :)
Y lo que dices de C/C++ solo es multiplataforma compilando un binario para cada plataforma parece contradictoria :S
O es arquitectura del procesador :P

@~:
Buena info! :) por cierto el procesador Intel y AMD no tiene nada que ver en C/C++ verdad?
mi codigo C/C++ ( sin assembly) se va a poder ejecutar en cualquier procesador...?

rir3760

Cita de: RHL en  8 Marzo 2012, 01:36 AMY lo que dices de C/C++ solo es multiplataforma compilando un binario para cada plataforma parece contradictoria :S
No lo es.

C/C++ es portable a nivel de código fuente, cuando se sigue el estándar en cuestión este puede ser compilado (sin importar la implementación) y tendrá un comportamiento bien definido.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Eternal Idol

#5
Cita de: RHL en  8 Marzo 2012, 01:36 AM
@Eternal Idol:
Genial siempre me entiendes Eternal, y pues mi cuestion por ahorita es que por ejemplo el registro FS no se puede
acceder desde C/C++ hay que usar inline assembly entonces por eso me cuestionada :P
y eso que dices sobre VC++ x64 sin Inline Assembly que fatal :S me has ahorrado un dolor de cabeza cuando tenga
una maquina x64 e instale VC++  :)
Y lo que dices de C/C++ solo es multiplataforma compilando un binario para cada plataforma parece contradictoria :S
O es arquitectura del procesador :P

@~:
Buena info! :) por cierto el procesador Intel y AMD no tiene nada que ver en C/C++ verdad?
mi codigo C/C++ ( sin assembly) se va a poder ejecutar en cualquier procesador...?

¿Y para que QUERES usar el registro FS? Seguro que podes hacer lo mismo sin recurrir a inline assembly, en x64 si lo necesitas realmente podes crear un .asm y poner todo el codigo ahi y sino recurrir a la clasica definicion de un array de caracteres con el codigo en hex y ejecutarlo  :silbar:

Como te dijo ya rir3760 no lo es, si queres tener un solo binario podes recurrir a Java o .NET  que tienen maquinas virtuales (las cuales deben ser compiladas para cada una de las plataformas soportadas). Y no, no es arquitectura del procesador solamente, para ejecutar un programa nativamente necesitas un version para Windows x64 y otra para Linux en la misma arquitectura. No te olvides que tienen formatos de ejecutables diferentes, (PE vs ELF), diferentes interfaces (la CRT tiene que inicializar por fuerza con la API del sistema, sea cual sea), etc..

Si, tu codigo se podra ejecutar en cualquier procesador compatible (pero no en cualquiera de 64 bits, para IA-64 tenes que recompilar, para ARM tambien, etc.) mientras no uses extensiones sin comprobar que estan presentes (MMX, 3Dnow, SEE, etc)..
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

~

A mí me tardó 6 meses a tiempo completo para aprender apenas lo básico del Ensamblador x86 (con muchos intentos anteriores fallidos de entenderlo), incluyendo arrancar la máquina, leer/escribir discos duros IDE en modo PIO, entrar a modo de 32 bits, y cosas por el estilo.

Aprender a hacer programas de Windows me tomó mucho más tiempo, y aprender apropiada y realmente C entendiendo una parte de las interacciones a nivel de Ensamblador es algo realmente reciente para mí, y todavía me hace falta entender cómo funcionan las excepciones en C++ vistas desde Ensamblador.

En resumen, el lenguaje Ensamblador es diferente para cada procesador distinto, de diferente arquitectura, no es algo de un momento sino que un proceso de preparación y aprendizaje de tiempo completo y extenso. Este lenguaje es una necesidad. C/C++ son el siguiente nivel estandarizado, para que el programador no tenga que encargarse de conocer las instrucciones y optimizaciones de un CPU, y es el compilador el que debe tener la capacidad de crear código de máquina para uno u otro CPU, y a su vez encapsularlo en un formato de archivo apropiado para la máquina (aunque es posible correr código sin absolutamente ningún formato, pero a un nivel más bajo y difuso, pero es perfectamente posible).

Con compiladores como GCC, a veces no solo es posible sino que necesario crear módulos de código objeto hechos en Ensamblador. Estos se usan más tarde en programas de C/C++ usando extern.

Pero en términos generales, siempre hay convenciones que respetar, aunque se trabaje directamente en Ensamblador, por ejemplo, la más común, que es respetar las convenciones de llamada de funciones, sean estas cdecl (programas en C) o stdcall (WinAPI), y llamadas a funciones de C++ con excepciones, etc., que es algo mucho más avanzado y mucho menos conocido con lo que trabajar directamente en Ensamblador (como el caso de MFC).

____________________________________________________


Aquí hay un programa de Windows de 32 bits que hice 100% en Ensamblador, incluyendo las estructuras del formato PE. Todo está hecho en Ensamblador.


http://devel.no-ip.org/tmp/ClockCount.zip

El programa se llama ClockCount.exe, e incluye también un archivo .BAT junto con la versión correcta de NASM para compilarlo por uno mismo. Todo está allí, también el icono del programa incluido como código fuente de Ensamblador.


El código fuente muestra el tipo de instrucciones que se usan en aplicaciones de usuario. No hay obligación de usar extensiones del CPU especiales. Nada especial ni privilegiado.

Siempre es posible emular absolutamente cualquier instrucción que no requiera privilegios especiales, y siempre y cuando sepamos lo que estamos haciendo, con los manuales de Intel/AMD en mano, aunque obviamente nunca van a tener el rendimiento de las instrucciones nativas.

El CPU puede indicar qué extensiones están disponibles usando la instrucción cpuid y otros trucos avanzados, aunque ese es un tema muy extenso, como para otro tema del foro y totalmente cubierto por los manuales de los CPUs.

C y C++ son independientes de Ensamblador, aunque las características de más bajo nivel siempre son fuertemente influenciadas por esos CPUs, tanto así que los mismos manuales y la propia Intel ofrecen un compilador optimizador de C/C++, y las optimizaciones al estilo de C/C++ se dicuten en los propios manuales.

_______________________________________________

Los registros de segmento como el de FS o GS (a aún peor para un sistema operativo bien establecido, DS, ES o SS, o CS -solo indirectamente-) no se usan en lenguajes como C/C++, así que tampoco suelen usarse en las APIs de 32 o 64 bits de los diferentes sistemas.

Aunque a más bajo nivel, todo se vale, por ejemplo estando en 16 bits y activar 32 bits, incluso podemos ejecutar (o incluso emular) el código del BIOS, que no tiene un formato definido.
Sitio web (si la siguiente imagen no aparece es porque está offline):

x64core

Ya esta gracias a todos :D lo tengo claro conceptos e ideas :)

@~:
Por cierto, mire tu web y tienes muchas cosas interesantes me dare una vuelta mas seguido por tu web :)

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón