Пользовательское соглашение вызова 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 (с некоторым встроенным ассемблером)?

большое спасибо

1 ответ

Решение

Документацию о соглашениях о вызовах и о том, как параметр передается функции (в регистрах, которые? Что находится в стеке и т. Д.), Смотрите в документе Agner Fog.

Затем вы можете взглянуть на исходный код libffi, чтобы увидеть, как они это делают.

Другие вопросы по тегам