Все зависит от соглашения о вызовах C, в котором был скомпилирован код C. Соглашение о вызовах - это то, как вызывающий и вызываемый абоненты будут взаимодействовать в отношении передачи данных в функцию и возврата значений впоследствии.Это включает тех, кто будет выполнять такие вещи, как резервное копирование регистров в стек до / после вызова, будет ли необходимо подготовить регистры перед вызовом функции C, можете ли вы гарантировать, что регистры вернутся, как они были, и т. Д.
Вам необходимо выяснить, как был скомпилирован код C (с какой настройкой Calling Convention).Обратите внимание, что это также зависит от архитектуры.Сводку различных соглашений о вызовах и описание каждого из них можно найти в Википедии здесь:
http://en.wikipedia.org/wiki/Calling_convention
http://en.wikipedia.org/wiki/X86_calling_conventions
На x86, cdecl иstdcall - самые популярные соглашения.cdecl означает, что ваш код ASM должен выполнить очистку, в то время как stdcall говорит, что вызываемая функция отвечает за это.Если у вас есть исходный код для функции C, я бы предложил передать необходимые флаги компилятору, чтобы сделать его условием «Callee cleanup» (обычно это stdcall, но также можно использовать safecall и fastcall), что означает, что вы можете безопасно вызывать Cфункция, не беспокоясь о повреждении реестра.