Having worked with assembly a little bit (MIPS, for Coursera's Compilers class -- but it's supposed to be better than x86!) and with LLVM IR a bit more (I'm writing my own compiler for a language that compiles to IR), I really wonder about the trade-offs for learning LLVM IR vs assembly if your goal is to learn lower-level details.
In particular, LLVM IR is just so much easier to use, even though it lives at a very similar level as "real" assembly. Granted, you don't have to take care of register allocation yourselves, and the instructions are slightly more abstract (an abstraction which is inevitably leaky), but it does really drive home the differences between registers and memory, how pointers and addressing are used at the lower level, that there are different calling conventions (but you don't have to learn the niggly little details for each), it's portable, etc.
Anyone who has used both more extensively who can comment?