volatile
or caller-saved:
assumed to be destroyed by a subroutine call.

non-volatile
or callee-saved:
preserved (or not used) by a subroutine.

We will try to use only the registers %eax, %ecx, and
%edx, since %ebx is callee-saved.

Any floating values that need to be
preserved across a call must be saved on the stack prior to the call and
restored afterwards. Routines are provided to save one floating
register on the stack and restore it.