Пользовательское соглашение вызова X86_64 для вызова функции C
Я должен сделать интерфейс (скажем, обертку), который разрешает вызов из кода сборки 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 (с некоторым встроенным ассемблером)?
большое спасибо