Общие соглашения о вызовах для IA-32 говорят:
• Callee-save registers
%ebx, %esi, %edi, %ebp, %esp
Callee must not change these. (Or restore the caller values before returning.)
• Caller-save registers
%eax, %edx, %ecx, condition flags
Caller saves these if it wants to preserve them. Callee can freely clobber.
Почему существует эта странная конвенция? Почему бы не сохранить все регистры перед вызовом другой функции? Или сохраните и восстановите все с помощью pusha
/popa
?