Yea - I know what you mean,
God blessed me with the gift that I can write the most complex algorithms and they are always bug free.
I never need to debug. Whether I write in C or ASM or right away in hex code. My code is always bug free.
;-)
Where few remember the Hex values, do you have exceptional memory, or did you spent a lot of time looking at HEX code.
But I was told that some people find coding in C easier.
Its easier to debug some thing if you have some debug symbols, or else you need to remember the assembler code, some people have problems with that if they have not looked at code in a while, there for debug symbols and stack traces are big help. Even more so if your trying to fix something someone else wrote.
So if you are like me then coding everything right away in ASM is fine.
I think that comes with experience, if he knows what he want to do, and know how need to do it then that's fine.
But some times you don't know what best approach is and you need to try different methods out, to find the best one, unless you already know what best machine code to use, it maybe not best idea to spend too much time optimizing a bad idea, that your going trow away latter for a different approach.
I have seen few examples people spending a lot of time writing assembler code, to do some thing ending up doing every thing on the CPU, instead of using existing routines or OS functions that take advantage of DMA, and hardware acceleration.
Its also silly to not use a existing routine that someone has spent years perfecting, and ending up writing your own routines that ends up being slower. So its a good idea to do some bench-marking.
And if you did write better routine way not replace / optimize the old routine instead of bloating the code with duplication.
And when it comes to bug free code, I have see my share of programs that where so called bug free, that wrote out side of allocated memory blocks.
It a good idea to run Enforcer/Mungwall, program can run with out crashing, but yet corrupt memory for other applications or the OS, if blocks close to the block that was overwritten was reserved by another program this might happen while your writing the program so you might not notice it.
For example allocating some memory example 256, and counting to 256, instead of 255, that's a mistake that is so easy to do.