Part 1: http://www.microsoft.com/msj/0298/hood0298.aspx
Part 2: http://www.microsoft.com/msj/0698/hood0698.aspx
They're outdated in some ways but still relevant.
Once you have the fundamentals down, the best source for up-to-date knowledge relevant to performance optimization and assembly programming for x86 machines is Agner Fog's manuals:
That said, there is a lot of room for improvement on Matt Pietrek's columns. This is a great blog post series waiting to happen for anyone up to the task. Take out the cruft about ENTER, LEAVE, LOOP, etc, include more about basics like signed/unsigned comparisons (JG/JGE/JL/JLE are the signed counterparts of JA/JAE/JB/JBE, where the mnemonic is that 'A' stands for above and 'B' for below), and so on. I'm trying to get an assembly guru and technical blogger coworker of mine interested in writing this. If that doesn't work, maybe I'll have to roll up the sleeves and write it myself.
If you want to write trainers for video games, knowing Assembly is a must!
Well, sorta. Knowing just enough to get by, and being able to look up the rest is good enough.
I used to write trainers for the original XBox. Unlike PC trainers, which can often rely on simply putting the same value in the same memory location over and over, XBox required that you modify the code in memory.
I still do it for PC games occasionally, but it's gotten harder... Windows seems to try to prevent hacks by loading the code into different places in RAM each time.
tl;dr - There are still uses for Assembly other than just debugging.
Assembly was the first real coding I did after learning BASIC. It taught me:
1) How to build and structure an application - from intrinsics like 'divide' upwards, I now seem more able to build large/complex systems than people who only learnt HLLs
2) Fundamental datatypes like DWORDs that have helped me optimise performance of HLL apps
3) To appreciate the heavy lifting provided by a language like Ruby - and an understanding of how it does what it does
Application developers that have never worked on the bare metal are poorer for it.
Graphics Programming Black Book - Michael Abrash
"If a program requires 1.5 megabytes, it will not fit on a 1.44 Mbyte floppy. Likewise, if an application requires 2 megabytes RAM, the user will have to install an extra megabyte if there is only one available in the machine. Even on big machines with 32 or more megabytes, writing gigantic applications isn't excusable."
Most people will speak out against any language because of some troll or flame-war they've followed on the Internet.
If you want to learn assembly, do it. There doesn't have to be a practical application. You can learn something just because you think it's cool. It's not always about the salary or the market-usefulness of each skill you learn.
Why oh why did the author give both of these very different creatures the same title?
I don't know a good comprehensive book about modern x86 assembly. Can you recommend one?
Every piece of hardware should have a manual like this!
So knowing x86 still has some practical value, and with reverse engineering, just knowing a small subset of x86 will go a long way.
One word: badass.
I managed to pick up this ability after getting to know assembly programming, and the subsequent "higher level manifestations" in C/C++, from Paul Carter's open source ebook: http://www.drpaulcarter.com/pcasm/
When I first downloaded this book in 2002, I was fairly comfortable with the linux command line, gcc and emacs, but I knew nothing about assembly and computer architecture (registers/interrupts etc).
Whereas other books on assembly were somehow tied to DOS, this was a free book that wasn't tied to any OS and was easy to understand.
Don't get me wrong, I appreciate the free book. But there's a need for a good assembly book to learn the ropes.
I got my black belt in assembly by writing a 1 kilobyte software synth for a 4k intro that was never finished (but the synth was playable). That was one cool project!