Se você não decidir a aprender um pouco de assembler, você provavelmente deve aprender algo como 6502 assembler em um Commodore 64 (emulado, é claro), ou 68000 em um Amiga.
Você pode ter uma idéia do Commodore 64 aqui ...
http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main
O clássico livro "tudo o que você precisa saber" é o descrito aqui ...
http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/
Provavelmente, você pode encontrar uma digitalização em PDF se olhar em volta.
O IMO, 6502 é mais fácil que o Z80 e 68000 é mais fácil que o 8086 - conjuntos de instruções mais regulares etc.
Mas a CPU é apenas um aspecto do hardware. Além disso, uma CPU moderna é uma fera massivamente diferente e faz coisas transparentes mesmo do ponto de vista dos compiladores - como apresentar um espaço de endereço virtual.
Uma vantagem particular do 6502 no C64 é que não apenas a CPU é simples, mas também há algumas muito simples de se mexer com o hardware. Eu me divertia muito brincando com o chip de música SID.
Então - provavelmente é um exercício que vale a pena se você não gastar muito tempo com ele. Eu aprendi o 6502 assembler como minha segunda língua quando eu tinha 14 anos, logo após o Commodore Basic. Mas, na maioria das vezes, ele está obtendo esse modelo de trabalho muito simples, para que você possa adicionar idéias mais sofisticadas com um mínimo de mal-entendido.
Algumas coisas úteis que você pode aprender trabalhando em assembler ...
- Como os registros da CPU funcionam.
- Como o endereçamento de memória funciona, incluindo a indireção.
- Como a pilha da CPU funciona.
- Como a lógica bit a bit funciona.
- Como a CPU controla os dispositivos de E / S.
- Como as interrupções funcionam.
Uma razão particular pela qual eu recomendo é obter uma melhor intuição da maneira como as etapas simples operam inteiramente determinística e mecanicamente e totalmente sem inteligência ou bom senso. Basicamente, acostumar-se ao modelo de execução imperativa em sua forma mais pura e teimosamente ignorante.
Precisamente quão útil é conhecer a maioria dessas coisas agora, no entanto, é uma pergunta difícil.
Uma coisa que você não aprenderá é como jogar bem com uma hierarquia de memória. Essas máquinas antigas geralmente tinham um modelo de memória simples, sem camadas de cache e sem memória virtual. Você também não aprenderá muito sobre concorrência - eles certamente eram maneiras de lidar com isso, mas na maioria das vezes significava interrupções. Você não precisava se preocupar com mutexes etc.
Às vezes, um modelo mental de como essas coisas uma vez trabalhou, ou de como funciona a montadora, pode até enganar. Por exemplo, pensar em um ponteiro C como um endereço pode levar a problemas de comportamento indefinidos. Normalmente, o ponteiro AC é implementado como um número inteiro contendo um endereço, mas não há garantia de que isso seja verdade. Por exemplo, em algumas plataformas bizarras, ponteiros diferentes podem apontar para diferentes espaços de endereço. Isso se torna importante quando você deseja fazer aritmética ou lógica bit a bit com dois ponteiros.
A menos que você tenha uma dessas plataformas bizarras, talvez não pense que se importa com isso - mas os compiladores hoje em dia têm cada vez mais probabilidade de explorar o comportamento indefinido dos padrões para otimização.
Portanto, um modelo mental da arquitetura do sistema pode ser útil, mas ainda é importante codificar para as especificações da linguagem, não para um modelo hipotético que sua linguagem e plataforma possam não respeitar.
Finalmente, muitas coisas úteis de modelos mentais vêm da idéia de como os compiladores geram código - e a geração de código para linguagens modernas é muito diferente dos compiladores bastante triviais disponíveis na época.
Este é o meu livro favorito por isso ...
http://dickgrune.com/Books/MCD_1st_Edition/
Juntamente com o material sobre análise e ASTs, etc, abrange a geração de código para uma variedade de paradigmas de linguagem - imperativos, OOP, funcionais, lógicos, paralelos e distribuídos - e também para gerenciamento de memória. Se você quiser saber como as chamadas de método polimórfico funcionam sem se atolar nos detalhes do conjunto de instruções da CPU, um livro como este é seu amigo - e haverá uma nova edição em breve.