That's a valid point but it still doesn't compare to the speed and ease of C. As a long term ASM coder I have plenty of "library" functions for math and data conversion etc. But C has these already, so in C you can do A = B * C. In assembler it needs to link in the math code, allocate variables for it (is there enough RAM? where to put the variables? Can vars be re-used with other math functions? Can the math code be placed in an optimal position in ROM? Was this code from a different type of PIC with different RAM issues?) etc etc.
All those assembler DECISIONS that can (given enough talent and work) produce much smaller and faster code take considerable time, and risk of something going wrong.
But in C typing the line A = B * C means the compiler already handles what math routines are needed, where they go, what variables can be re-used, what data conversions are needed etc. It may make code a little larger or slower running, but it's practically instant to the coder who can type A= B * C in just 3 seconds and it is DONE. And portable between all applications and microcontroller types.
I think of ASM and C as two different tools, both have strengths and weaknesses and it's been a bit amusing seeing some people here being so very black or white on the issue!
Assembler is a treetrunk and a chisel.
C is pre-cut lumber and a workshop full of carpentry tools!
In both cases you can make a chest of drawers... And most smart managers in the real world are going to insist on the pre-cut lumber and workshop. But a master capenter knows there will always be times to reach for that chisel, if not for the whole job just for part of the job.