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

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


person Matthieu    schedule 15.01.2010    source источник
comment
Visual C ++ имеет модификатор __declspec(naked), который не позволяет компилятору создавать пролог и эпилог.   -  person mmx    schedule 15.01.2010
comment
__declspec (naked) не поддерживается при компиляции для целей x64 (и встроенной сборки тоже).   -  person Andrey    schedule 23.12.2010


Ответы (1)


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

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

person Gregory Pakosz    schedule 15.01.2010
comment
Спасибо за ответы ; Я не знал libffi, сейчас проверю, звучит отлично. - person Matthieu; 15.01.2010
comment
На вашем месте, если бы это было возможно, я бы просто положился на libffi. Он стабилен, обслуживается и справляется со многими угловыми случаями. - person Gregory Pakosz; 15.01.2010
comment
Хорошо, документ Агнера Фога очень полезен. Но libffi не сохраняет все регистры, в частности регистры YMM (еще нет?). Между прочим, я смогу кое-что с этим поделать! Большое спасибо. - person Matthieu; 15.01.2010