I'm having trouble understand when it's appropriate to use a "memory"
clobber, when to use volatile, and when to use both. The manual is
unclear to me. Although I see that someone has tried to clarify it
since I last read it, it's still not obvious how "memory" is different
from `volatile'.

my understanding is

* volatile asm says something to the effect 'this changes state that you
(the compiler) don't know about' -- such as writing to an IO port.