2010-10-26 3 views
3

Не вдаваясь в подробности, скажем, мне нужно использовать нестандартное соглашение о вызове из кода C. Функции, которые используют это соглашение, могут возвращать несколько значений в стеке. Было бы просто поместить каждую функцию в оболочку, которая использует встроенную сборку, чтобы выполнить вызов, отправив результат через параметры указателя, указанные в оболочке. К сожалению, это решение не очень хорошо обобщается, и мне нужно что-то, что работает в общем случае. Должен ли я просто отказаться от использования макросов для инкапсуляции упаковки или есть более общий способ написать, скажем, переменную функцию invoke, которая обрабатывает грязную работу по управлению стеком?Как обернуть нестандартное соглашение о вызове в C?

ответ

3

Какой бы подход вы ни выбрали, вам нужно будет написать обертку в сборке. Невозможно возиться со стеком с C. Мне нравится ваша идея написать одну обертку invoke (в asm), которая выполняет всю грязную работу, а затем обертывать ее с помощью C.

+0

Если я пишу 'invoke' в C, используя встроенную сборку, безопасно ли чередование 'asm' с вызовами' va_arg', если я стараюсь не слипать стек? Кажется, что 'va_arg' просто корректирует указатель' va_list' на основе аргумента 'sizeof'. –

+0

С хорошей встроенной системой asm (обратите внимание: это полностью вне стандарта C), я думаю, что это должно быть достаточно безопасно, но я не уверен, почему вы хотите разбить asm на несколько блоков asm. Кстати, более чистой альтернативой может быть запись 'invoke' в чистом asm, а не как функция C с asm, поэтому вы можете повторно использовать стек непосредственно для внешнего вызова, не обманывая' va_arg'. –

+0

О, право. Я могу просто использовать 'cdecl'. По какой-то причине я думал, что «invoke» должен был бы вызывать-соглашение-агностик, что на самом деле не так. Благодаря! –

Смежные вопросы