Assembly is direct-to-processor coding and totally not portable. It is only used these days to write processor-specific code for operating system low-level programming. My last assembler coding was about 25 years ago for x86 TCP/IP device driver code. Even since then most of my device driver code for systems such as Solaris, Linux, and other *nixes has been in C or C++.
I've used it more recently than that, but primarily when I was working on code generators for compilers - so everything else could be written in higher-level languages. In other words, there are certain environments where it's useful, but they tend to be pretty specialized, as Rubberman said.
It strongly depends. Also on you personal preference.
1) In normal desktop or server like environments, ASM isn't widely used anymore. But compiler-developers still need a very good knowledge of ASM and machine code. I also heart that some parts of modern DBS are still based on pure ASM.
2) When it comes to microcontroller, even though times have changed as well here, you do find critical code written directly in ASM. Personally I do tend to use it there as well as you can directly influence the memory-layout of your programme. This can be very handy when you have just a few bytes of memory available.
3) In the hardware industry (or companies that write emulators) of course. They have to test their new electronics (virtual machines) and this can be done most comprehensively in ASM.
4) In education. I know a lot of students disgust it, but I believe my software has become much better once I understood the principles of machine code. And I also believe everyone who intends to do software developement outside of desktop/server should be familiar with ASM even though they're not planning to use it.