Это перевод The history of calling conventions, part 2. Автор: Реймонд Чен.
Первая часть.
Предварительно: информация ниже будет использована в дальнейшей дискуссии. Ну, здесь приведены не самые подробные детали, но вы можете увидеть объяснение... эммм... это трудно описать. Просто читайте далее.
Любопытно, что только платформы 8086 и x86 имеют несколько соглашений вызова. На всех других платформах есть только одна единственная модель вызова!
Сейчас мы погрузимся в такие мелочи, которые уже никто сегодня не помнит: более не существующие 32-х битные модели вызова.
Общая информация
Все перечисленные ниже процессоры выполнены в RISC-стиле. Это означает, что у них тьма регистров, причём все они равнозначны. Ну, за исключением нулевого регистра, который всегда равен нулю (оказывается, что ноль очень полезно всегда держать наготове в регистре). Любые значения (смысл) регистрам придают только модели вызова.
В духе старинных процессоров, команда "call" хранит адрес возврата в регистре, а не в стеке. Вообще, это хорошо, т.к. официально процессор ничего не знает о "стеке" - это конструкция модели вызова.
Как всегда, регистры или стековая память могут быть использованы для передачи параметров в функцию и возвращаемого значения в регистре, они могут быть свободными или сохраняемыми между вызовами.
Вы можете заметить, что все эти соглашения вызова RISC фактически представляют собой одну и ту же модель: лишнее доказательство, что 8086/x86 - платформа со странностями. Дьявольски популярная платформа со странностями.
Alpha AXP
Платформа Alpha AXP ("AXP" - это ещё один из акронимов, который официально никак не расшифровывается) имела 32 целочисленных регистра, в один из которых был жёстко зашит ноль. Согласно модели вызова, один из регистров был "стековым указателем", другой - возвращаемым значением, и ещё два имели особое назначение, не имеющее отношения к передаче параметров.
Первые шесть параметров передавались в регистрах, а оставшиеся - в стеке. Если функция имела переменное число параметров, то аргументы могли сбрасываться в стек, что позволяло получать к ним доступ как к массиву.
Семь других регистров сохранялись между вызовами, один был возвращаемым значением, а остальные регистры были свободны. 1 нулевой регистр + 1 стековый указатель + 1 адрес возврата + 2 специальных + 6 аргументов + 7 сохраняемых + 1 возвращаемое значение + 13 свободных = всего 32 регистра.
Имена функций на Alpha AXP не декорировались.
MIPS R4000
Первые четыре параметра передавались в регистрах a0, a1, a2 и a3; оставшиеся заносились в стек. Но это ещё не всё: в стеке было четыре "мёртвые зоны" - свободное место, где "могли бы быть" регистры с аргументами, если бы они помещались в стек. Это место использовалось теми функциями, которым нужно было временно сохранять аргументы перед их использованием (также это было полезным и для функций с переменным числом аргументов).
Имена функций на MIPS не декорировались.
PowerPC
Первые восемь параметров передавались в регистрах (от r3 до r10), а адрес возврата управлялся вручную.
Я забыл, что происходило с девятым и последующими параметрами...
Имена функций на PowerPC декорировались добавлением в начало двух точек.
В заключение: у меня нет личного опыта работы с машинами на процессорах MIPS или PPC, поэтому моё обсуждение этих процессоров может быть неточно, но я думаю, что основная идея у нас прозвучала.
Читать далее.
Комментариев нет:
Отправить комментарий
Можно использовать некоторые HTML-теги, например:
<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>
Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.
Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.
Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.
Примечание. Отправлять комментарии могут только участники этого блога.