2011-06-08 19 views
8

Para un cuadernillo de preguntas que estoy haciendo me tiene una pregunta sobre los marcos de pila:¿Este marco de pila producido es el correcto?

Considere la siguiente función en Nada (un lenguaje hecho), el lenguaje utilizado en las conferencias:

function f(x,y) 
begin 
var z 
z := y - x; 
return z * z; 
end; 

Tal una función que se podría llamar así:

n := f(a+2,b*3) 

el uso de diagramas para ilustrar su respuesta, explique la secuencia de eventos cuando se ejecuta la llamada a la función anterior, mostrando cómo el marco de pila se construye en la entrada a la función y destruida el salir de él, y cómo se utiliza el registro de puntero base al acceder a los parámetros xey, y la variable local z.

he respondido a esta pregunta y este es el marco de pila produje:

sackframe I produced

sólo quiero a alguien para corregir esto para mí si partes de él son mal ... o producir una nueva marco de pila (si alguien tiene el tiempo). Realmente apreciaré la ayuda.

+0

¿Esto supone que su lenguaje "Nada" está completamente basado en la pila o también está basado en registros? –

+0

@Heandel, no estoy del todo seguro de que piense que son ambas cosas. Nada es un lenguaje de programación inventado que tengo que usar en mi curso. –

+0

No estoy seguro de que pueda responderse sin saber mucho más sobre "Nada" y su implementación. Mi primer momento de inclinación de la cabeza es donde tienes 'a + 2',' b * 3' y 'Z' en el marco de pila nuevo y antiguo. No estoy seguro de por qué es eso. Y es 'b * 3' intencionalmente diferente de' b + 3'? Este es mi propio prejuicio, pero a falta de otra información, me inclinaría a tratar a Nada como una implementación típica de C en este sentido, en cuyo caso no creo que lo que tienes allí sea correcto, aunque tampoco puedo probarlo. sin el código para la función que 'f' se llama _from_. –

Respuesta

1

Depende de las convenciones de llamadas.

Pero si se asume que está utilizando _cdecl convención de llamada, ya que lo mencionas un puntero de base:

http://i.stack.imgur.com/5vQVB.jpg

Otras convenciones de llamada pueden utilizar registros, etc. optimizaciones pueden cambiar aún más este, como el compilador será código en línea, llame clases de cosas con para reordenar el código para la canalización de la CPU, etc.

Cuestiones relacionadas