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/ |