OSDev
http://osdev.su/

Соглащение вызова __cdecl
http://osdev.su/viewtopic.php?f=6&t=588
Страница 1 из 1

Автор:  suslik [ 21 июн 2012, 15:11 ]
Заголовок сообщения:  Соглащение вызова __cdecl

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

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

Автор:  grindars [ 21 июн 2012, 15:19 ]
Заголовок сообщения:  Re: Соглащение вызова __cdecl

Сохраняются вызываемым EBP, EBX, ESI, EDI. Сегментные (базовые) в __cdecl не включены. См., например, MSDN.

Автор:  suslik [ 21 июн 2012, 15:51 ]
Заголовок сообщения:  Re: Соглащение вызова __cdecl

Спасибо за оперативность.

Получается, что нужно искать 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 отличная от доков того или иного компилятора?

Автор:  grindars [ 21 июн 2012, 15:55 ]
Заголовок сообщения:  Re: Соглащение вызова __cdecl

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) - это для всех систем/компиляторов верно? Думаю, что да, т.к. очень логично.


Да.

Автор:  achesnokov [ 21 июн 2012, 16:49 ]
Заголовок сообщения:  Re: Соглащение вызова __cdecl

Соглашения вызова __cdecl одинаковые на системах. Описаны здесь: http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

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

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

Автор:  pavia [ 21 июн 2012, 18:23 ]
Заголовок сообщения:  Re: Соглащение вызова __cdecl

Смотрите Agner Fog, у него это расписано хорошо. Ссылка в ваикипедии есть.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/