En GCC puede utilizar un Goto calculado tomando la dirección de una etiqueta (como en void *addr = &&label
) y luego saltar a la misma (jump *addr
). El GCC manual dice que puede saltar a esta dirección desde cualquier donde en la función, es solo que saltar a ella desde otra función no está definido.GCC Goto calculado y el valor del puntero de pila
Cuando se salta al código, no puede asumir nada sobre los valores de los registros, por lo que, presumiblemente, los vuelve a cargar desde la memoria. Sin embargo, el valor del puntero de la pila tampoco está necesariamente definido, por ejemplo, podría estar saltando de un ámbito anidado que declara variables adicionales.
La pregunta es cómo hace GCC para establecer el valor del puntero de la pila en el valor correcto (puede ser demasiado alto o demasiado bajo)? ¿Y cómo interactúa esto con (si es así)?
Finalmente, para obtener puntos extra, ¿cuáles son las limitaciones reales sobre dónde puede saltar a una etiqueta? Por ejemplo, am , puede hacerlo desde un manejador de interrupciones.
+1, buena explicación – rkosegi
Lo interesante de los controladores de interrupción es que la pila estará ilesa y puede restaurar todos los registros (incluida la sp). En este caso, siempre que gcc haga lo que usted describió, en realidad podría saltar a una etiqueta desde un manejador de interrupciones. El único caso en el que no funcionaría es si gcc pone un código de manejo de pila especial por función alrededor del goto calculado. – jleahy
@jleahy: que sin duda podría (no sé si lo hace). El requisito mínimo es que la función tenga un estado "limpio" definido: todas las etiquetas cuya dirección se toma comienzan en este estado limpio, y todos los saltos calculados establecen el estado de limpieza antes de que salten. De hecho, podría ser incluso más mínima que eso: la "dirección de una etiqueta" podría ser la dirección de algún código que va desde el estado limpio al estado esperado en la etiqueta, luego 'goto' la etiqueta "real". Funcionaría, pero podría contradecir algo más que gcc dice sobre las direcciones de las etiquetas. –