Обновить

Возврат значений из функций в x86-64: регистры, память и скрытые аргументы

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели7.1K
Всего голосов 14: ↑12 и ↓2+13
Комментарии6

Комментарии 6

Статья норм. Карма,закладки,статья +/+/+.

В начале нужно было обязательно:

– рассмотреть rsp и rbp (если с первым - всё просто, то со вторым - всё не просто)

– calling convention

Иначе текст выглядит “магией”.

PS Буду писать виртуалки для скриптовых языков. Приглашаю поучаствовать.

Спасибо за обратную связь! Соглашусь, что в начале стоило про calling convention подробнее написать - в следующий раз учту. Статью несколько раз переписывал, поскольку то слишком, казалось бы, много информации уточняющей писал, то слишком мало. Пока пытаюсь пристреляться, насколько подробно стоит все разъяснять)

PS Буду писать виртуалки для скриптовых языков. Приглашаю поучаствовать.

Спасибо за приглашение, но, к сожалению, не моя специализация :(

Что меня всегда интересовало, это почему параметров входных через регистры можно передать больше, чем выходного размера?

Никогда не задумывался об этом, но стоит признать, что интересный вопрос Предположу, что “входных” регистров много, потому что очень часто функции принимают несколько аргументов. В то время как возвращаемых значений обычно меньше. Получается, что 2 регистра попросту оптимальный вариант, поскольку в большинстве случаев их хватает для фундаментальных типов и каких-то небольших других типов, а если что-то тяжелое, то можно просто другим способом возвращать - то есть как и делают с типами класса MEMORY, поэтому и нужда в большем количестве регистров пропадает.

Думаю,потому что обычно возвращается или bool,или указатель на память. Для всего этого хватает одного регистра.

Не затронута тема с плавающей точкой

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации