EAX используется для хранения возвращаемого значения функции в 32-битной платформе, мне просто интересно, если размер возвращаемого значения функции больше 4 байтов, как это делает eax? В этом случае ОС может сохранить возвращаемое значение в стеке и сохранить адрес стека в EAX, но как же ОС может определить, является ли значение, хранящееся в EAX, адресом для возвращаемого значения или фактически является возвращаемым значением?Как можно вернуть возвращаемое значение eax, размер которого превышает 4 байта?
ответ
Вызывающий и вызывающий должны договориться о том, что содержат регистры и стек. Это называется calling convention, который является частью более крупной концепции, называемой application binary interface (ABI). Вызов определяет, как он хочет называться (т. Е.: должны ли аргументы быть в стеке, в регистре и т. Д.), А компилятор гарантирует, что генерируемый им код соответствует соглашению о вызове.
Что касается вашего конкретного вопроса, это зависит от ABI. Иногда, если возвращаемое значение больше 4 байтов, но не более 8 байтов, его можно разделить на EAX и EDX. Но большую часть времени вызывающая функция просто выделяет некоторую память (обычно в стеке) и передает указатель на эту область вызываемой функции.
Обратите внимание, что роль ОС не так важна, как кажется. В одной и той же системе могут сосуществовать двоичные группы с различными соглашениями о вызовах, и двоичные файлы могут даже использовать разные соглашения о вызовах внутри страны. ABI ОС имеет значение только тогда, когда двоичный код вызывает свои системные библиотеки.
- 1. Возвращаемое значение% eax Convention
- 2. Increment регистр EAX на 4 байта
- 3. Как вернуть комплексное возвращаемое значение?
- 4. Как работает «mov (% ebx,% eax, 4),% eax»?
- 5. Размер магазина Elasticsearch в 1000 раз превышает размер байта документа
- 6. Есть ли __asm {}; вернуть значение eax?
- 7. Код не может принимать файл, размер которого превышает размер массива?
- 8. Текст ввода, размер которого превышает размер, определенный в CSS
- 9. как рендерить json в frontend, размер которого превышает 2gb
- 10. Ассамблея (,% EAX, 4)
- 11. Как вернуть возвращаемое значение кнопки в «ОК»
- 12. AngularJS: как вернуть возвращаемое значение из службы
- 13. Почему ссылочный размер всегда 4 байта - C++
- 14. Почему размер `char` 4 байта в Rust?
- 15. Android: распределение байтов превышает максимальный размер кучи байта
- 16. NamedPipeServer разделяет данные, если размер потока превышает 1024 байта
- 17. Запись 4 байта шестнадцатеричного от 4 байта
- 18. Точка теста% EAX% EAX
- 19. опкод и далее/4, значение которого дают EIP
- 20. Значение байта импорта: значение байта
- 21. Как вернуть бит из байта
- 22. Размер пользовательского байта?
- 23. `testl` eax против eax?
- 24. Как вернуть число символов, частота которых превышает пороговое значение
- 25. Как вернуть возвращаемое значение и установить его в «x»?
- 26. Получить размер байта данных
- 27. Java Размер байта Размер массива
- 28. Как получить возвращаемое значение IStaticPortMappingCollection.Add вернуть или нет?
- 29. x86_64 - cmpxchg. Возвращаемое значение
- 30. Можно ли тратить ложный mov eax, esi?
См. Ответы на этот вопрос: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –