Se non decide di imparare un po 'di assemblatore, probabilmente si dovrebbe imparare qualcosa come 6502 assembler su un Commodore 64 (emulato, ovviamente), o 68000 su un Amiga.
Puoi avere un'idea del Commodore 64 qui ...
http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main
Il classico libro tutto quello che devi sapere è quello descritto qui ...
http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/
Probabilmente puoi trovare una scansione PDF se ti guardi intorno.
IMO, 6502 è più facile di Z80 e 68000 è più facile di 8086 - set di istruzioni più regolari ecc.
Ma la CPU è solo un aspetto dell'hardware. Inoltre, una CPU moderna è una bestia enormemente diversa, e fa cose che sono trasparenti anche dal punto di vista dei compilatori, come la presentazione di uno spazio di indirizzi virtuale.
Un vantaggio particolare del 6502 sul C64 è che non solo la CPU è semplice, ma c'è anche qualcosa di molto semplice da hackerare con l'hardware. Mi divertivo molto a giocare con il chip musicale SID.
Quindi - è probabilmente un esercizio utile se non ci passi troppo tempo. Ho imparato 6502 assemblatore come seconda lingua quando avevo circa 14 anni, subito dopo Commodore Basic. Ma soprattutto sta ottenendo quel modello di lavoro molto semplice in modo da poter aggiungere idee più sofisticate con un minimo di incomprensioni.
Alcune cose utili che puoi imparare lavorando in assemblatore ...
- Come funzionano i registri della CPU.
- Come funziona l'indirizzamento della memoria, inclusa la direzione indiretta.
- Come funziona lo stack della CPU.
- Come funziona la logica bit a bit.
- Come la CPU controlla i dispositivi I / O.
- Come funzionano gli interrupt.
Una ragione particolare che consiglierei è quella di ottenere una migliore intuizione del modo in cui i semplici passaggi operano in modo completamente deterministico e meccanico e completamente senza intelligenza o buon senso. Fondamentalmente abituarsi al modello dell'esecuzione imperativa nella sua forma più pura e ostinatamente ignorante.
Proprio come utile è quello di conoscere la maggior parte di queste cose ora, però, è una domanda difficile.
Una cosa che non imparerai è come giocare bene con un'erarchia di memoria. Quelle vecchie macchine avevano per lo più un semplice modello di memoria senza livelli di cache e memoria virtuale. Inoltre non imparerai molto sulla concorrenza: erano certamente dei modi per gestirlo, ma per lo più significava interruzioni. Non devi preoccuparti di mutex ecc.
A volte, un modello mentale di come una volta funzionavano queste cose , o di come funziona l'assemblatore, può persino fuorviare. Ad esempio, pensare a un puntatore C come un indirizzo può portare a problemi di comportamento indefiniti. Il puntatore CA è normalmente implementato come un numero intero contenente un indirizzo, ma non vi è alcuna garanzia che ciò sia strettamente vero. Ad esempio, su alcune piattaforme bizzarre, puntatori diversi possono puntare su spazi di indirizzi diversi. Ciò diventa importante quando si desidera eseguire una logica aritmetica o bit a bit con due puntatori.
A meno che tu non abbia una di quelle piattaforme bizzarre, potresti non pensare che ti interessi - ma i compilatori in questi giorni hanno sempre più probabilità di sfruttare comportamenti indefiniti dagli standard per l'ottimizzazione.
Quindi un modello mentale dell'architettura di sistema può essere utile, ma è comunque importante codificare in base alle specifiche del linguaggio, non a un modello ipotetico che il tuo linguaggio e la tua piattaforma potrebbero non rispettare.
Infine, molte cose utili sul modello mentale derivano dall'idea di come i compilatori generano codice - e la generazione di codice per i linguaggi moderni è molto diversa dai compilatori piuttosto banali disponibili allora.
Questo è il mio libro preferito per quello ...
http://dickgrune.com/Books/MCD_1st_Edition/
Insieme alle cose sull'analisi e AST ecc., Copre la generazione di codice per una serie di paradigmi linguistici - imperativo, OOP, funzionale, logico, parallelo e distribuito - e anche per la gestione della memoria. Se vuoi sapere come funzionano le chiamate ai metodi polimorfici senza impantanarti nei dettagli del set di istruzioni della CPU, un libro come questo è tuo amico - e presto uscirà una nuova edizione.