Я пытаюсь вставить некоторые C-хуки в некоторый код, который кто-то написал в asm. Я не очень разбираюсь в x86 asm и хочу убедиться, что делаю это безопасно.
Пока у меня так много:
EXTERN _C_func
CALL _C_func
И это похоже на работу, но я уверен, что это опасно как есть. По крайней мере, это может разрушить EAX, а возможно и больше.
Так что я думаю, все, что мне нужно знать, это: какие регистры уничтожает C и как мне обеспечить правильное сохранение регистров? Что еще я могу сделать, чтобы убедиться, что я могу безопасно вставлять хуки в произвольные места?
Я использую Visual Studio для функций C, если это помогает.
Спасибо.
UPDATE:
Я посмотрел на «параноидальный» метод, предложенный несколькими людьми, и он выглядит так:
pushfd
pushad
call _C_func
popad
popfd
AD = (A) ll общие регистры
FD = (F) лаги
(Я не уверен, что означает «d», но это означает 32-битные регистры вместо 16-битных.)
Но наиболее эффективный метод показан в ответе Крагена ниже. (Предполагая, что вам не нужно сохранять флаги. Если вам это нужно, добавьте инструкции FD.)
Кроме того, будьте осторожны с распределением большого количества переменных стека в вашей функции C, поскольку это может привести к переполнению стекового пространства подпрограммы asm.
Я думаю, что по этому поводу, спасибо за помощь всем!