I like assembler. It teached me programming.
It does not confront creative programmers with structure and rules,
and it does not impose structure where not much creativity exists in the first place.
After a number of years, I increasingly found myself emulating things that compilers do,
for instance relocation tables, calls using fake stacks + goto, and custom addressing modes.
It's really an effin' waste in terms of maintainability.
Using assembler ties you to a specific processor model.
It's hard to understand even your own code.
It's very easy to write total bad code, being virtuous with a large number of bits stretching over many pages.
Why does it do that according to a flag that is set upon some weird condition, which itself...in another module...
well...it's accessed using hex masks not names that make sense...
Don't use assembly if any possible! It's totally bad. It will restrict your productivity a lot.
It will take 10x to 15x the time! And it is very hard to maintain. Maybe not so difficult to write assembly initially,
but even reusing smaller sections can be difficult if the interfaces are not clear.
If absolutely required, use assembler for time critical parts, or where the compiler likely will generate code which is
an unneccessary waste of code space.
You don't have to use C like C from a book you can use it very similar to assembler. Simply use the addressing modes that have native support and use them in a way that is supported natively. You have to know assembler well for that, but, don't use it.
My opinion is 500 words assembler is the margin that is recommendable.
4K words are the absolute margin anything beyond that is not maintainable for ordinary programmers.
I changed from RISC assembler to C recently. I wrote an application, and it was a matter of a few sessions (using all the 2K codespace). It is easily readable, it is even portable. I like it. There are still cases where I have to use assembler (time critical I/O), otherwise I simply don't want to use it anymore.
If they insist on assembler the best arguments are the poor maintainability, and the non-existent portability.
Code space is no longer a valid argument these days. Neither time critical routines for most cases- why not simply use a more powerful MCU? Most of the cycle saving maybe could be done with just a few small assembler sections. It's no argument and not good programming style to code the whole project in assembler.