Мне нужно создать интерфейс (скажем, оболочку), который разрешает вызов из ассемблерного кода 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)?
Большое спасибо
__declspec(naked)
, который не позволяет компилятору создавать пролог и эпилог. - person mmx   schedule 15.01.2010