Не вдаваясь в подробности, скажем, мне нужно использовать нестандартное соглашение о вызове из кода C. Функции, которые используют это соглашение, могут возвращать несколько значений в стеке. Было бы просто поместить каждую функцию в оболочку, которая использует встроенную сборку, чтобы выполнить вызов, отправив результат через параметры указателя, указанные в оболочке. К сожалению, это решение не очень хорошо обобщается, и мне нужно что-то, что работает в общем случае. Должен ли я просто отказаться от использования макросов для инкапсуляции упаковки или есть более общий способ написать, скажем, переменную функцию invoke
, которая обрабатывает грязную работу по управлению стеком?Как обернуть нестандартное соглашение о вызове в C?
3
A
ответ
3
Какой бы подход вы ни выбрали, вам нужно будет написать обертку в сборке. Невозможно возиться со стеком с C. Мне нравится ваша идея написать одну обертку invoke
(в asm), которая выполняет всю грязную работу, а затем обертывать ее с помощью C.
Смежные вопросы
- 1. GCC жалуется на нестандартное соглашение о вызове «ZEND_API»
- 2. Соглашение о вызове iPhone/ARM
- 3. Как найти соглашение о вызове сторонней dll?
- 4. Почему существует соглашение о вызове для массивов?
- 5. соглашение о вызове для функции, возвращающей STRUCT
- 6. Соглашение о вызове COM на x64
- 7. Имея проблемы с JavaScript соглашение о вызове
- 8. Как изменить соглашение о вызове по умолчанию в MinGW gcc
- 9. Правильное соглашение о вызове неуправляемой функции DLL
- 10. Соглашение о вызове ARM to C, регистрирует для сохранения
- 11. Как исследовать соглашение о вызове двоичного файла PE в Windows?
- 12. Захват и использование _thiscall как крюка (соглашение о вызове GCC)
- 13. Delphi thiscall соглашение о вызовах
- 14. Что такое соглашение о вызове syscall OpenSolaris (x86)?
- 15. g ++ соглашение о вызове cdecl со Steinberg VST SDK
- 16. Tess4J: "Invalid соглашение о вызове 63", несмотря на правильные версии
- 17. Соглашение о звонках на x64
- 18. Каким образом будет реализовано соглашение о вызове() для js-объектов?
- 19. Соглашение о расширении файла реализации шаблона C++?
- 20. Соглашение о скобках Python
- 21. Соглашение о связывании
- 22. Как обернуть ошибки при вызове COM на C++?
- 23. Что такое соглашение о вызове overloaded = operator в C++ с помощью указателей?
- 24. Как ускорить соглашение о схеме в Кассандре?
- 25. Язык ассемблера - Соглашение о звонках
- 26. Что такое соглашение о вызове по умолчанию для функции лямбда C++?
- 27. Могу ли я программно вывести соглашение о вызове, используемое dll C++?
- 28. Когда использовать соглашение о калибровке `__fastcall`
- 29. Почему компилятор go «gc» использует другое соглашение о вызове, чем C?
- 30. Соглашение о вызове стека между .NET и C на WinCE 6.0
Если я пишу 'invoke' в C, используя встроенную сборку, безопасно ли чередование 'asm' с вызовами' va_arg', если я стараюсь не слипать стек? Кажется, что 'va_arg' просто корректирует указатель' va_list' на основе аргумента 'sizeof'. –
С хорошей встроенной системой asm (обратите внимание: это полностью вне стандарта C), я думаю, что это должно быть достаточно безопасно, но я не уверен, почему вы хотите разбить asm на несколько блоков asm. Кстати, более чистой альтернативой может быть запись 'invoke' в чистом asm, а не как функция C с asm, поэтому вы можете повторно использовать стек непосредственно для внешнего вызова, не обманывая' va_arg'. –
О, право. Я могу просто использовать 'cdecl'. По какой-то причине я думал, что «invoke» должен был бы вызывать-соглашение-агностик, что на самом деле не так. Благодаря! –