2012-03-20 1 views
7

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

+0

См. Ответы на этот вопрос: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

ответ

12

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

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

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

Смежные вопросы