<p>It's been a while since I last coded arm assembler and I'm a little rusty on the details. If I call a C function from arm,  I only have to worry about saving r0-r3 and lr, right?</p>

<p>If the C function uses any other registers, is it responsible for saving those on the stack and restoring them? In other words, the compiler would generate code to do this for C functions. </p>

<p>For example if I use r10 in an assembler function, I don't have to push its value on the stack, or to memory, and pop/restore it after a C call, do I?</p>

<p>This is for arm-eabi-gcc 4.3.0.</p>

It depends on the
ABI
for the platform you are compiling for. On Linux, there are two ARM ABIs; the old one and the new one. AFAIK, the new one (EABI) is in fact ARM's AAPCS. The complete EABI definitions currently live
here on ARM's infocenter
.
From
the AAPCS, §5.1.1
:
r0-r3
are the argument and scratch registers;
r0-r1
are also the result registers
r4-r8
are callee-save registers
r9
might be a callee-save register or not (on some variants of AAPCS it is a special register)
r10-r11
are callee-save registers
r12-r15
are special registers
A callee-save register must be saved by the callee (in opposition to a caller-save register, where the caller saves the register); so,
if
this is the ABI you are using, you do not have to save r10 before calling another function (the other function is responsible for saving it).
Edit:
Which compiler you are using makes no difference; gcc in particular can be configured for several different ABIs, and it can even be changed on the command line. Looking at the prologue/epilogue code it generates is not that useful, since it is tailored for each function
and
the compiler can use other ways of saving a register (for instance, saving it in the middle of a function).
Terminology: "callee-save" is a synonym for "non-volatile" or "call-preserved":
What are callee and caller saved registers?
When making a function call, you can assume that the values in r4-r11 (except maybe r9) are still there after (call-preserved), but not for r0-r3 (call-clobbered / volatile).