Si no decide aprender un poco de ensamblador, probablemente debería aprender algo así como 6502 ensamblador en un Commodore 64 (emulado, por supuesto), o 68000 en un Amiga.
Puedes hacerte una idea del Commodore 64 aquí ...
http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main
El clásico libro de todo lo que necesitas saber es el que se describe aquí ...
http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/
Probablemente pueda encontrar un escaneo PDF si mira a su alrededor.
OMI, 6502 es más fácil que Z80, y 68000 es más fácil que 8086: más conjuntos de instrucciones regulares, etc.
Pero la CPU es solo un aspecto del hardware. Además, una CPU moderna es una bestia enormemente diferente, y hace cosas que son transparentes incluso desde el punto de vista de los compiladores, como presentar un espacio de direcciones virtual.
Una ventaja particular del 6502 en el C64 es que no solo la CPU es simple, sino que también hay hardware muy sencillo de piratear. Solía divertirme mucho jugando con el chip de música SID.
Entonces, probablemente sea un ejercicio que valga la pena si no le dedica demasiado tiempo. Aprendí 6502 ensamblador como mi segundo idioma cuando tenía unos 14 años, justo después de Commodore Basic. Pero sobre todo está obteniendo ese modelo de trabajo muy simple para que pueda agregarle ideas más sofisticadas con un mínimo de malentendidos.
Algunas cosas útiles que puedes aprender trabajando en ensamblador ...
- Cómo funcionan los registros de CPU.
- Cómo funciona el direccionamiento de memoria, incluida la indirección.
- Cómo funciona la pila de CPU.
- Cómo funciona la lógica bit a bit.
- Cómo controla la CPU los dispositivos de E / S.
- Cómo interrumpe el trabajo.
Una razón particular que recomendaría es tener una mejor intuición de la forma en que los pasos simples funcionan de manera totalmente determinista, mecánica y absoluta, sin inteligencia ni sentido común. Básicamente, acostumbrarse al modelo de ejecución imperativo en su forma más pura y obstinadamente ignorante.
Sin embargo, lo útil que es saber la mayoría de esas cosas ahora es una pregunta difícil.
Una cosa que no aprenderá es cómo jugar bien con una jerarquía de memoria. Esas máquinas antiguas en su mayoría tenían un modelo de memoria simple sin capas de caché y sin memoria virtual. Tampoco aprenderá mucho sobre la concurrencia: ciertamente fueron formas de manejar eso, pero en su mayoría significaron interrupciones. No tenía que preocuparse por mutexes, etc.
A veces, un modelo mental de cómo estas cosas una vez trabajado, o de cómo funciona la ensamblador, incluso puede inducir a error. Por ejemplo, pensar en un puntero C como una dirección puede conducir a problemas de comportamiento indefinidos. El puntero de CA normalmente se implementa como un entero que contiene una dirección, pero no hay garantía de que sea estrictamente cierto. Por ejemplo, en algunas plataformas extrañas, diferentes punteros pueden apuntar a diferentes espacios de direcciones. Esto se vuelve importante cuando quieres hacer aritmética o lógica bit a bit con dos punteros.
A menos que tenga una de esas plataformas extrañas, es posible que no piense que le importa, pero en la actualidad los compiladores son cada vez más propensos a explotar comportamientos indefinidos para la optimización.
Por lo tanto, un modelo mental de la arquitectura del sistema puede ser útil, pero sigue siendo importante codificar según las especificaciones del lenguaje, no según un modelo hipotético que su lenguaje y plataforma pueden no respetar.
Finalmente, muchas cosas útiles del modelo mental provienen de tener una idea de cómo los compiladores generan código, y la generación de código para lenguajes modernos es muy diferente de los compiladores bastante triviales disponibles en ese momento.
Este es un libro mío favorito para eso ...
http://dickgrune.com/Books/MCD_1st_Edition/
Junto con el material sobre análisis y AST, etc., cubre la generación de código para una variedad de paradigmas de lenguaje: imperativo, OOP, funcional, lógico, paralelo y distribuido, y también para la gestión de la memoria. Si desea saber cómo funcionan las llamadas a métodos polimórficos sin atascarse en los detalles del conjunto de instrucciones de la CPU, un libro como este es su amigo, y pronto saldrá una nueva edición.