Как может eax хранить возвращаемое значение, размер которого превышает 4 байта? - PullRequest
7 голосов
/ 20 марта 2012

EAX используется для хранения возвращаемого значения функции в 32-битной платформе, мне просто интересно, если размер возвращаемого значения функции больше 4 байт, как eax справляется с этим?В этом случае ОС может сохранить возвращаемое значение в стеке и сохранить адрес стека в EAX, но тогда как ОС может определить, является ли значение, хранящееся в EAX, адресом возвращаемого значения или оно само является возвращаемым значением?

1 Ответ

12 голосов
/ 20 марта 2012

Вызывающий и вызываемый должны договориться о том, что содержат регистры и стек. Это называется соглашение о вызовах , которое является частью более широкой концепции, называемой двоичный интерфейс приложения (ABI) . Вызываемый определяет, как он хочет вызываться (, т. Е. , должны ли аргументы быть в стеке, в регистрах и т. Д.), А компилятор гарантирует, что генерируемый им код соответствует соглашению о вызовах.

Что касается вашего конкретного вопроса, это зависит от ABI. Иногда, если возвращаемое значение больше 4 байтов, но не больше 8 байтов, его можно разделить на EAX и EDX. Но большую часть времени вызывающая функция просто выделяет некоторую память (обычно в стеке) и передает указатель на эту область вызываемой функции.

Обратите внимание, что роль ОС не так важна, как вы думаете. Двоичные файлы с различными соглашениями о вызовах могут сосуществовать в одной и той же системе, и двоичные файлы могут даже использовать различные соглашения о вызовах внутри страны. ABI ОС важен только тогда, когда двоичный файл вызывает свои системные библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...