Mi primera duda sería, la programación de ensamblador de un procesador de 8 bits es diferente a la programación de uno de 16 bits, y este a su vez es diferente de uno de 32 o 64 bits?
Sí. Son diferentes. Si fueran iguales, para qué cambiar nomenclaturas...
Es decir, si aprendo a programar ensamblador para procesadores de 32 bits no podré programar para uno de 64 bits?
Correcto. Hablar de 8bits, 32bits... es una abreviatura para referirse a la arquitectura de procesadores.
Un procesador de 8 bits, podría asimilarse a un centro de salud de tu barrio (por ejemplo), y uno de 32 bits a un hospital de una ciudad... Como es fácil de entender el centro de salud tendrá ciertas limitaciones de las que el hospital dispone...
Cuales son las diferencias sustanciales, las interrupciones?
De entrada el tamaño de los buses, no solo el de direcciones, tambien el de datos y el de control... por lo que incluso una instrucción idéntica en 2 arquitecturas diferentes tendrán una codificación distinta.
Además, crece el número de capacidades disponibles, lo que implica la aparición de nuevas instrucciones (inexistentes en versiones previas), a menudo ligeros cambios en las existentes o ampliaciones, nuevos registros, etc...
Mi otra duda es, he pensando en aprender de esta forma, descargar un emulador de un procesador de 8 bits y programar una aplicación para entender el procesador y demás.
Si estuviéramos al comienzo de los 90, te diría que no solo no es mala idea empezar con un emulador de 8 bits, para empezar y familiarizarse, sino que sería incluso imprescindible... pero a fecha de hoy te diría que sea un vistazo no exhaustivo...si familiarizarte para saber qué tiene y que no un procesador de 8 bits. Una vez conozcas con cierto detalle su arquitectura te diría que avances a los 16 bits... y no pierdas tiempo en programar nada... solo limítate a diferenciar lo que tiene y que no tiene cada arquitectura, para comprender los cambios en la siguiente y como ha evolucionado, eso ofrece una pespectiva muy útil.
Luego hacer lo propio con uno de 16 bits, de 32 y 64 bits. Todo esto con el fin de entender los procesadores. Les parece buena idea? o como aprendieron ustedes?
Para iniciar es recomendable empezar con emu8086? o mejor con DosBox?
Yo te diría que no pierdas tiempo en programar en 8 ni 16 bits ni en sus ensambladores, aprende solo sobre su arquitectura, y programa solo para 32 y 64 bits...
Que opinan de utilizar Masm32 para empezar a aprender?
Sí, claro... Masm32 es una buena opción.
Aquí una pagina a consultar:
-https://www.plantation-productions.com/Webster/HighLevelAsm/
La ultima pregunta es la siguiente, si yo aprendo a programar en ensamblador para un procesador de 16 bits y quiero posteriormente desensamblar un programa que funciona en windows para ver su funcionamiento, es posible que no entienda el código porque aprendí fue ensamblador para procesadores de 16 bits?
Leer código desensamblado, es harina de otro costal.
...perder el tiempo para entender como funciona un programa, mediante código desensamblado, es lo mismo que ir a una escombrera que sabe que contiene todos los escombros de una catedral, para entender como era o estaba construída.
En general es una tarea titánica pretender 'entender el funcionamiento de un programa' en base a su desensamblado. En la práctica (individual) suele limitarse a tareas específicas. En general la mayor parte del código de un programa no tiene ningún misterio ni es preciso perder tiempo en él, son 'cosas sabidas' (por cualquier programador medio), por ejemplo el funcionamiento de un menú, o la apertura y control de ventanas. Basta centrarse en los detalles que uno (digamos que) no sabe como funcionan EXACTAMENTE, aunque esto tiene más un carácter de 'hacking' que de programar en ensamblador. Por lo que antes de meterte en faena, te diría que te contestes a tí mismo cuales son tus pretensiones:
- Aprender a programar en ensamblador.
- Aprender técnicas de hacking (para lo que es necesario cierto conocimiento de ensamblador, pero no de forma exhaustiva).
En base a tu respuesta, el camino a seguir es algo distinto.