EAX se usa para almacenar el valor de retorno de la función en la plataforma de 32 bits, solo me pregunto si el tamaño del valor de retorno de una función es mayor a 4 bytes, ¿cómo lo maneja eax? En este caso, OS puede guardar el valor de retorno en la pila y almacenar la dirección de la pila en EAX, pero ¿cómo puede OS decir si el valor almacenado en EAX es una dirección para el valor de retorno o es en realidad el valor de retorno?¿Cómo puede eax almacenar el valor de retorno de qué tamaño es más grande que 4 bytes?
Respuesta
El que llama y el que llama tienen que ponerse de acuerdo sobre lo que contienen los registros y la pila. Esto se llama calling convention, que es parte de un concepto más grande llamado application binary interface (ABI). El destinatario define cómo se quiere llamar (, es decir, si los argumentos deben estar en la pila, en los registros, etc.) y el compilador asegura que el código que genera cumple con la convención de llamadas.
En cuanto a su pregunta específica, depende de la ABI. A veces, si el valor de retorno es mayor que 4 bytes pero no mayor que 8 bytes, se puede dividir en EAX y EDX. Pero la mayoría de las veces la función de llamada simplemente asigna algo de memoria (generalmente en la pila) y pasa un puntero a esta área a la función llamada.
Tenga en cuenta también que el papel del sistema operativo no es tan importante como parece pensar. Los binarios con diferentes convenciones de llamada pueden coexistir en el mismo sistema, y los binarios incluso pueden usar diferentes convenciones de llamada internamente. El ABI del sistema operativo solo es importante cuando el binario llama a sus bibliotecas del sistema.
- 1. ¿BIGINT (8) es el número entero más grande que mysql puede almacenar?
- 2. ¿Por qué el tamaño de mi sindicato es más grande de lo que esperaba?
- 3. ¿Por qué el tamaño de la tabla InnoDB es mucho más grande de lo esperado?
- 4. ¿Cuál es el tamaño de archivo más grande que puede abrir Vim? (64-bit)
- 5. ¿Por qué el retorno anticipado es más lento que otro?
- 6. ¿Por qué no hay un registro que contiene los bytes más altos de EAX?
- 7. ¿Qué es más grande que un doble?
- 8. Función de Excel: ¿Qué valor es más grande
- 9. ¿Por qué el tamaño del mapa de bits es más grande en la memoria que en el disco en Android?
- 10. El valor de resta de dirección siempre es 12? ¿El tamaño de las variables es leve?
- 11. ¿Qué sentido tiene LEA EAX, [EAX]?
- 12. por qué el tamaño de referencia es siempre de 4 bytes - C++
- 13. ¿Cómo obtener el tamaño de un archivo que es mayor a 4 Gb?
- 14. ¿Por qué "hg push" es mucho más grande que .hg?
- 15. int es de 4 bytes, pero todavía se puede almacenar en una charla por qué no hay desbordamiento
- 16. ¿Cuál es el tamaño más grande que puede tener un archivo de instalador de paquete de Windows .msi?
- 17. Índice de MySQL es más grande que los datos almacenados
- 18. Cómo asegurarse de que un int es de 4 bytes o 2 bytes en C/C++
- 19. ¿Cómo devolver un valor de retorno complejo?
- 20. C++ asegurando un tamaño flotante de 4 bytes
- 21. ¿Cómo es que Appstore puede almacenar CVV2?
- 22. es nulo JSON válida (4 bytes, nada más)
- 23. ¿Por qué es el botón de Firefox más grande?
- 24. ¿Cuál es el tipo de datos más grande para almacenar (e imprimir) un número entero?
- 25. `testl` eax contra eax?
- 26. ¿Por qué el navegador muestra td es más grande que mi propiedad de ancho especificado?
- 27. ¿Por qué hay un booleano de 4 bytes en .NET?
- 28. ¿Por qué GCC generó mov% eax,% eax y qué significa?
- 29. ¿Tamaño de bytes personalizado?
- 30. ¿Por qué mode_t usa 4 bytes?
Ver las respuestas a esta pregunta: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –