Почему ebx, esi и edi непригодны для работы со стековым фреймом? - PullRequest
2 голосов
/ 24 апреля 2019

У меня возникают проблемы при работе с таким небольшим количеством регистров при создании функции в сборке - что внутри этих регистров мешает мне их использовать?Могу ли я скопировать их содержимое в параметр при кодировании и сбросить его перед выходом из функции, чтобы не нарушить ее назначение?

1 Ответ

4 голосов
/ 24 апреля 2019

Почему ebx, esi и edi непригодны для использования

Это полностью зависит от ABI и соглашений о вызовах , используемых платформой, хотя бывает так, чтобольшинство компиляторов соответствуют шаблону, в котором регистры eax, ecx и edx считаются энергозависимыми при вызове функций, в отличие от других регистров.

Можно ли скопировать их содержимое в параметр, покакодировать и сбрасывать его перед выходом из функции, чтобы не нарушить ее назначение?

Да, на самом деле, это довольно распространенная идиома в коде x86 для восстановления регистров, которые должны сохраняться при вызовах функций, например, так:

my_fn:
    push ebx
    push esi


    ; code ...

    pop esi
    pop ebx
    ret

Предполагая, что часть ; code ... не разбалансировала стек, esi и ebx восстанавливаются до старых значений перед выходом из функции.

...