Предполагая соглашение о вызовах при объединении C и x86 Assembly

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

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


person User123abc    schedule 18.02.2012    source источник
comment
Нет, ваш ассемблерный код не соответствует вашему C-коду до момента компоновки. Слишком поздно позволять компилятору C учитывать любое принятое вами соглашение о вызовах. Одна из причин популярности встроенного ассемблера.   -  person Hans Passant    schedule 19.02.2012


Ответы (3)


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

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

person R.. GitHub STOP HELPING ICE    schedule 19.02.2012

Соглашения о вызовах означают гораздо больше, чем просто порядок аргументов. Существует хороший PDF-файл, объясняющий все детали, написанный Агнером Фогом: Соглашения о вызовах для различных компиляторов C++ и системы.

person Evgeny Kluev    schedule 18.02.2012

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

person old_timer    schedule 18.02.2012