C: valor de retorno a través de la pregunta de pila / registro

Soy nuevo en C, y hay una cosa que no puedo entender. Cuando la función devuelve algo que no es más grande que el registro, mi compilador lo coloca en EAX. Cuando devuelvo la estructura grande (no el puntero sino la estructura misma), se devuelve a través de la pila.

Mi pregunta es: ¿cómo sabe el compilador cómo llamar a la función exportada por otro objeto? Hay convenciones de llamada (como stdcall) pero se trata de pasar los argumentos, no leer el valor devuelto, ¿no?

Debería haber alguna regla como "Si el valor de retorno declarado es mayor que EAX, entonces tómelo de [bp -...]".

Y uno más: ¿sería correcto decir que los objetos que quiero devolver, más grandes que el registro, deben almacenarse en el montón y devolverse mediante un puntero para evitar todo lo que no sea la manipulación de la pil

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta