Firstly, IMO there is virtually no point in learning x86 assembly... it's hideously complicated due to the constant revions (and need to preserve backwards compatibility). Not to mention the main fact - that most compilers are now efficient enough to outdo all but the most expert assembly programmer.
The real use for assembly is embedded systems - the chips in phones, cars, microwaves, etc. Although many microProcessors are shared in multiple apps, you'll really need to learn about the general architecture of this stuff, rather than for a specific chip type (this applies to PC processors, too).
I'd suggest getting a book like (my textbook for CompArch last year) Computer Organisation and Design (Patterson & Hennessy - complex, tough, but informative) to leanr the basics... but you'll really need to do proper courses to leanr. and to become a good pro, you'd probably need to do something like a CES degree (I do Computer Science, which is less hardware focused than this - although we do do some assembly EmbSys programming and work on compilers this year).
If you're learning a language like C++, and you want to be able to use other languages as well (and also to understand the code a bit better), I'd strongly suggest you try and find a good textbook on data structures and algortihms, so you can help recognise the code better.
Finally (for either type of programming), take a course in it, even if it's just a few months long. There is no better way to learn than through practical use - I always see the point of my Uni lectures as providing a foundation for developing experience, rather than just gaining knowledge.