Я должен сделать интерфейс (скажите, обертка), которые позволяют вызов из ассемблерного кода 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)?
Большое спасибо
Для документации о вызове конвенций и как параметр передан на функцию (в регистрах? Что? Что на стеке и т. Д.) Посмотрите на документ документ Агнера .
Затем вы можете взглянуть на исходный код SIBFFI исходный код, чтобы увидеть, как они это делают.