As an addendum to the parent (I, too, have a background in ASM programming): You're working at such low level of detail that any application of non-trivial size becomes extremely difficult to write truly effectively. You just can't keep so many details in mind at once. And when you need to work as a team, not alone, interfacing code becomes a nightmare.
So of course you abstract your assembler code. You define interfaces, develop and use libraries of common application tasks, and just generally structure your code at small and large scales.
But at that point, you are starting to lose the advantage of ASM. A good, modern C compiler is a lot better than you to find serendipitous optimization points in structured code, and it is not constrained by human memory and understanding so it doesn't need to structure the final code in a readable (but slower) way.
Small, time-critical sections, fine. Small embedded apps on tiny hardware, no problem. But ASM as a general-purpose application language? That stopped making sense decades ago.