Я должен сделать интерфейс (скажем, оболочку), который позволяет вызывать код сборки X86_64, используя его соглашение о вызовах к функции C, с другим соглашением о вызовах. Лучше всего было бы быть довольно «независимым от компилятора» (просто измените оболочку), поэтому я ищу что-то, что помещает регистры / стек обратно в компилятор. Я уже посмотрел здесь: Пользовательское соглашение о вызовах для P / Invoke и C # , и оно близко к тому, что я должен сделать. В настоящее время я использую GCC, но приветствуются советы от других компиляторов!
Итак, вот что нужно для лучшего понимания проблемы (нестандартное соглашение о кодировании странно):
pushq %r11 # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11 # restores %r11 ; return value is in the structure
Мне нужно иметь возможность вызывать "специальную" (упаковочную) функцию C; здесь работа будет заключаться в распределении вызовов между другими функциями C. Таким образом, эта оболочка должна найти% r11, сохранить все регистры и подготовить стек для дальнейшего вызова. Есть ли правильный способ сделать это в C (с некоторым встроенным ассемблером)?
Большое спасибо