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.zipEl 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.