Почему ebx, esi и edi непригодны для использования
Это полностью зависит от ABI и соглашений о вызовах , используемых платформой, хотя бывает так, чтобольшинство компиляторов соответствуют шаблону, в котором регистры eax
, ecx
и edx
считаются энергозависимыми при вызове функций, в отличие от других регистров.
Можно ли скопировать их содержимое в параметр, покакодировать и сбрасывать его перед выходом из функции, чтобы не нарушить ее назначение?
Да, на самом деле, это довольно распространенная идиома в коде x86 для восстановления регистров, которые должны сохраняться при вызовах функций, например, так:
my_fn:
push ebx
push esi
; code ...
pop esi
pop ebx
ret
Предполагая, что часть ; code ...
не разбалансировала стек, esi
и ebx
восстанавливаются до старых значений перед выходом из функции.