Pregunta

¿Hay una manera de forzar gcc para pasar los parámetros de una función en la pila?

No quiero utilizar los registros de paso de parámetros.

Actualizar : Soy usando el brazo-gcc de CodeSourcery

¿Fue útil?

Solución

De acuerdo con: http: //infocenter.arm .com / ayuda / tema / com.arm.doc.ihi0042d / IHI0042D_aapcs.pdf

Los primeros cuatro registros R0-R3 (a1-a4) se utilizan para pasar valores de los argumentos en una subrutina y para devolver un resultado valor de una función. También pueden ser usado para mantener valores intermedios dentro de una rutina (pero, en general, sólo entre llamadas a subrutinas).

Hay, en ARM, no hay otras convenciones de llamada, pero el valor por defecto, que yo sepa. Y aquí es por qué:

  1. ¿Por qué quieres? Su función no sería exigible en forma compilada por otras funciones, la creación de un lío de compatibilidad.
  2. Las llamadas a las funciones del sistema que se ajusten a la ABI no funcionaría, a menos que el compilador era capaz de diferenciar entre convenciones de llamada. Ahora, sé que en el pasado hay diferentes convenciones de llamada para x86-32 , pero aviso cómo x64 es más simple (AMD64 vs Microsoft lo hizo). ¿Por qué, cuando se diseña el ARM llamando convención, le permitirá tantas diferentes convenciones de llamada? Se crea un lío compatibilidad.

Otros consejos

Puede trate de envolver los parámetros en una estructura; por ejemplo, si su función es int calc_my_sum(int x, int y) {return x+y;} se puede cambiar de la siguiente manera (feo):

struct my_x_y {
    int x, y;
    my_x_y(): x(0), y(0) {} // a non-trivial constructor to make the type non-POD
};

int calc_my_sum(my_x_y x_and_y) {
    // passing non-POD object by value forces to use the stack
    return x_and_y.x + x_and_y.y;
}

Como alternativa, puede simplemente añadir 4 parámetros ficticias para agotar los registros, por lo demás parámetros utilizarán pila:

struct force_stack_usage {
    int dummy0, dummy1, dummy2, dummy3;
}

int calc_my_sum(force_stack_usage, int x, int y) {
    return x + y;
}

dónde almacenar una variable local es depende de cómo lo va a usar. Si necesita obtener la dirección de una variable local, la variable local sólo puede ser almacenada en la pila. Así que cuando se pasa la subrutina un puntero, este parámetro se pasa a través de la pila.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top