Это вопрос 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 не используют префикс, а большинство других платформ ...
Нет, ваш код сборки не соответствует вашему коду C до момента ссылки. Слишком поздно, чтобы позволить компилятору C быть умным в отношении любого принятого вами конвенционного соглашения. Одна из причин популярности встроенной сборки. –