Hi Craig
I started writing in Assembler around 1970. At one stage I 'knew' just about every microprocessor language - and then gave up tracking the ones which I knew were not going anywhere. I also knew most standard high-level languages until they too got boring (being little more than variants on each other).
I have written everything from device drivers to science packages to database systems (not the app, the system), robot and machine controllers, image analysis systems, ...
I have debugged OSs, compilers and ... Both the first OS and the compiler were fun, as I was able to tell the vendor exactly where the bug was without the source code.
Now - I am retired.
So yes, I know what a disassembler can and cannot do. I agree with the limits you gave.
Mind you, decompiling C is not that hard: there is little difference between the two!
Cheers
Roger