2012-03-20 57 views
7

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?

+0

Ver las respuestas a esta pregunta: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

Respuesta

12

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.

Cuestiones relacionadas