2012-02-18 2 views
4

У меня есть некоторые процедуры сборки, которые вызывают и принимают аргументы из C-функций. Прямо сейчас, я предполагаю, что эти аргументы передаются в стеке в порядке cdecl. Это справедливое предположение?Принимая соглашение о вызове при объединении C и x86 Assembly

Определите это компилятор (GCC) и убедитесь, что аргументы переданы правильно, или мне нужно вручную перейти и объявить их cdecl? Если да, будет ли этот атрибут сохранен, если я укажу более высокий уровень оптимизации?

+3

Нет, ваш код сборки не соответствует вашему коду C до момента ссылки. Слишком поздно, чтобы позволить компилятору C быть умным в отношении любого принятого вами конвенционного соглашения. Одна из причин популярности встроенной сборки. –

ответ

1

Это вопрос ABI для платформы, на которой вы пишете код. Почти все платформы следуют за Unix System V ABI для вызова вызова C и других проблем ABI, который включает в себя как общий документ ABI (gABI), описывающий общие характеристики ABI во всех архитектурах CPU, так и специфический для процессора документ ABI (psABI), специфичный для конкретная архитектура/семейство процессоров. Когда дело доходит до x86, это соответствует тому, что вы называете «cdecl». Таким образом, с практической точки зрения, сборка x86, предназначенная для вызова из C, должна быть записана для принятия «cdecl». В основном единственное исключение из универсальности этого соглашения вызова - это функции Windows API, которые используют свое собственное нестандартное соглашение о вызове «stdcall» из-за устаревших проблем совместимости с WinLL dll thunk; тем не менее, соглашение о назначении по умолчанию для x86 Windows по-прежнему «cdecl».

Более важная проблема при написании asm для вызова из C заключается в том, должны ли символы имен иметь префикс с подчеркиванием или нет. Это широко варьируется между платформами, и общая тенденция заключается в том, что платформы на базе ELF не используют префикс, а большинство других платформ ...

0

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