High level languages let you trade complexity for processor time and codespace - both of which are quite cheap now. Paying software developers is still expensive.
I'll agree that if you have a processor with less than 4k of flash, assembly makes sense, but that is really on the low end. I'd still take a hack at it with C first. C is designed to let you use low level constructs so you can get very close to assembly with C.
Compilers let you reuse the work of the compiler developers; You write your code and then when the compiler is improved you get the benifits for free - no extra work required. Modern architectures like Itanium are banking on this.
Assembler is free but C is getting to the point that it is free or very cheap. A free or low cost C compiler is a requirement when I'm looking at a new architecture.
You can't even compare modern operating systems and games to old systems. The Windows code is millions of lines long and billions of instructions. Games that ran at 8Mhz are on the order of a megabyte in size. New games are several gigabytes in size - 1000 times more complicated. This isn't an excuse for buggy software, but buggy software comes from crappy design practices not the language you use.
All that said, assembly is a good skill to have. It's hard to really understand computer architectures without having done some assembly programming. It's also hard to write good C without some knowledge of the instruction set you're dealing with. There is probably a lot of assembly in the windows kernel. If there is something tht needs to be really fast assembly is the best you can get - but there are things that don't need to be fast, a delay routine for example. You have to choose tools that are appropreate for the task.
Now that we've rehashed the old assembler vs. C argument: Nigel You'll be dissapointed to know that Microsoft's new C# is even more wasteful than C or C++. :wink: