OSDev

для всех
Текущее время: 27 апр 2024, 09:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Соглащение вызова __cdecl
СообщениеДобавлено: 21 июн 2012, 15:11 

Зарегистрирован: 21 июн 2012, 14:57
Сообщения: 10
Товарищи, помогите: нужно вызывать C-функции из ассемблерного кода и ассемблерные функции из C-кода. Спрашивал Google и Википедию, но чёткого ответа так и не получил.

Допустим ассемблерные функции и C-функции все имеют соглашение вызова __cdecl. Хорошо, т.о. при вызове C-функции я должен запихать параметры в стек в обратном порядке, и забирать возвращаемое значение из EAX (или EDX:EAX). Но какие регистры она мне испортит? В Википедии и в других местах говорят о EAX, ECX, EDX, FS, GS. Но где можно посмотреть "официальное" соглашение? Чтобы быть уверенным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соглащение вызова __cdecl
СообщениеДобавлено: 21 июн 2012, 15:19 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
Сохраняются вызываемым EBP, EBX, ESI, EDI. Сегментные (базовые) в __cdecl не включены. См., например, MSDN.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соглащение вызова __cdecl
СообщениеДобавлено: 21 июн 2012, 15:51 

Зарегистрирован: 21 июн 2012, 14:57
Сообщения: 10
Спасибо за оперативность.

Получается, что нужно искать ABI (Application Binary Interface) для каждой целевой системы, например для Unix, и читать там? Или в доках к компилятору. А я думал, что __cdecl не должно зависеть от системы/компилятора.

Так же есть ещё вопросик:
Цитата:
All arguments are widened to 32 bits when they are passed. Return values are also widened to 32 bits and returned in the EAX register
(цитата с того же MSDN) - это для всех систем/компиляторов верно? Думаю, что да, т.к. очень логично.

ПодЫтожу: где есть официальная спецификация для __cdecl отличная от доков того или иного компилятора?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соглащение вызова __cdecl
СообщениеДобавлено: 21 июн 2012, 15:55 

Зарегистрирован: 22 май 2007, 15:29
Сообщения: 283
suslik писал(а):
Получается, что нужно искать ABI (Application Binary Interface) для каждой целевой системы, например для Unix, и читать там? Или в доках к компилятору. А я думал, что __cdecl не должно зависеть от системы/компилятора.


По факту оно во всех системах одинаково, но какой-либо общей спецификации нет.

suslik писал(а):
Так же есть ещё вопросик:
Цитата:
All arguments are widened to 32 bits when they are passed. Return values are also widened to 32 bits and returned in the EAX register
(цитата с того же MSDN) - это для всех систем/компиляторов верно? Думаю, что да, т.к. очень логично.


Да.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соглащение вызова __cdecl
СообщениеДобавлено: 21 июн 2012, 16:49 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Соглашения вызова __cdecl одинаковые на системах. Описаны здесь: http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

Отличаются соглашения только формированием имени функции. Из C функция может генерироваться с подчеркиванием, а может без подчеркивания. Это зависит от платформы (компилятора). Проще всего проверить соглашения компиляцией исходников из C в ассемблер. И вы все увидите для своего компилятора.

Я на эту тему писал статейку.
http://dev64.wordpress.com/2012/01/23/gcc-calling-conventions-investigation/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соглащение вызова __cdecl
СообщениеДобавлено: 21 июн 2012, 18:23 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Смотрите Agner Fog, у него это расписано хорошо. Ссылка в ваикипедии есть.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB