[Refactored here from WizardsAreDangerous]
Yes, higher-level languages are working better, but there is a point to "Just enough Assembler to Get By." In many cases when your application crashes, the real difference between solving the bug and screaming in frustration comes down to how well you can read a little assembly language. Although we'd prefer our crashes to occur in a module with source code and a complete call stack, many crashes just don't happen that way. When you do crash, you're generally left looking at a DisassemblyWindow in the Microsoft Visual C++ debugger and wondering how you're going to figure out where you are in the program, let alone why it crashed. There is a huge difference between a 3 month Web Certification graduate and a solid software engineer. MattPietrek and JohnRobbins like to say:
Ok, I'm fairly familiar with Intel assembly (I learned it to write a graphics library DOS enhanced mode a number of years ago, and brushed up on it when taking the required assembly class in school). However, when I look at the code in the DisassemblyWindow brought up when something in my VisualBasic program crashes, I'm at a loss to do anything worthwhile with it. I know what the line does, but the whole is meaningless to me. And even if it wasn't, without the source code to what crashed, how am I supposed to fix anything?
Buy JohnRobbins's book DebuggingApplications. He has a whole chapter on this. We like to ask an interview question at NuMega "You have crashed at 0x0876566 (or some such address). You have no stack trace, no debugger, no source. How do you proceed?" This book will show you how. It will also teach you that very little of Intel Assembly is used by the Microsoft compilers and in one day you can learn enough - it's one of the chapters.