Пользовательское соглашение о вызовах X86_64 к вызову функции C

Я должен сделать интерфейс (скажите, обертка), которые позволяют вызов из ассемблерного кода X86_64 с помощью его соглашения о вызовах для функции C с другим соглашением о вызовах. Лучшей вещью состоял бы в том, чтобы быть симпатичный "компилятор, независимый" (juste изменение обертки), таким образом, я ищу что-то, что помещает материал регистров/стека в компилятор назад. У меня уже есть взгляд здесь: Пользовательское соглашение о вызовах для 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 (с некоторыми, встраивают asm)?

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

5
задан Community 23 May 2017 в 12:19
поделиться

1 ответ

Для документации о вызове конвенций и как параметр передан на функцию (в регистрах? Что? Что на стеке и т. Д.) Посмотрите на документ документ Агнера .

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

3
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: