+1 for art of assembly. I also like Gavin's guide https://stuff.pypt.lt/ggt80x86a/asm1.htm
That mostly did for the concepts involved, independently of that I also did an awful lot of electronics which did not hurt.http://www.coranac.com/tonc/text/asm.htmhttp://blog.quirk.es/2008/12/things-you-never-wanted-to-know-about.html
and of course http://problemkaputt.de/gbatek.htm
Learn one type of assembly and the second will be far easier, learn two and you can muddle your way through most things. Wind in a bit of CPU design history* as well as the general programming logic/functions (ceiling, floor, the various divides...) and boolean operations and you are laughing.
*mainly just enough to not be too put out when you go for an older thing and find it lacks a divide function, floating point and instead of registers being a type of very fast general purpose memory they are almost separate things unto themselves -- for x86 you have however many dozens of registers and thus considering instructions individually for each register is insane but for the NES 6502 with three ones you will spend almost all your time considering and instructions that play accordingly.
I learned 6502 from the classic "6502.txt" manual, and then writing an emulator based on it.
I would not recommend this approach.
Writing an emulator does tend to get you to be quite good at a given system. To that end while I may or may not suggest the former (never read it but being .txt I can imagine it will be a bit lacking compared to some) the latter is worth considering.
That said I think my suggestion for a less intensive method is tracing in emulators. Start from an action replay type cheat and do something cool with it. You might not get the really exotic instructions being used but you can always look those up once you have the core set down.