0 calificaciones0% encontró este documento útil (0 votos)
30 vistas2 páginas
Este documento describe un tipo de código intermedio que se asemeja al lenguaje ensamblador. Explica que representa las instrucciones como operaciones binarias similares a MIPS y que utiliza instrucciones de lectura y escritura de memoria con registros base y desplazamientos. También muestra un ejemplo de cómo traducir una expresión a este código intermedio.
Este documento describe un tipo de código intermedio que se asemeja al lenguaje ensamblador. Explica que representa las instrucciones como operaciones binarias similares a MIPS y que utiliza instrucciones de lectura y escritura de memoria con registros base y desplazamientos. También muestra un ejemplo de cómo traducir una expresión a este código intermedio.
Este documento describe un tipo de código intermedio que se asemeja al lenguaje ensamblador. Explica que representa las instrucciones como operaciones binarias similares a MIPS y que utiliza instrucciones de lectura y escritura de memoria con registros base y desplazamientos. También muestra un ejemplo de cómo traducir una expresión a este código intermedio.
Existen codigos intermedios de diversos tipos que varıan en cuanto a su sencillez, lo
próximos que están a las maquinas reales y lo facial que es trabajar con ellos. Nosotros nos centraremos en un tipo de código que se parece bastante al lenguaje ensamblador. Existen otros tipos de código intermedio que representan los programas como árboles o grafos. También existen representaciones mixtas que combinan grafos o árboles y representaciones lineales. El formato que usaremos para las operaciones binarias es similar al del ensamblador MIPS: op dst, op1, op2 , donde op es un operador, dst es el registro destino de la operación, op1 y op2 son los operandos. Si op termina en i, el segundo operando es un valor inmediato (entero o real). En caso de que el operador sea unario, la forma de la instrucción es op dst, op1 . Para acceder a memoria utilizaremos instrucciones de acceso a memoria usando un registro base y un desplazamiento. Para leer de memoria utilizamos lw dst, desp(base) donde dst es el registro destino, desp es un entero que representa el desplazamiento y base es el registro base. Si queremos acceder a una dirección absoluta, utilizamos $zero como registro base, aprovechando que este registro siempre devuelve el valor 0. Para escribir en memoria utilizamos sw fnt, desp(base) donde fnt es el registro fuente y el resto tiene el mismo significado que antes. Por ejemplo, la sentencia a:= b*(-c), donde a es una variable local en la dirección 1 respecto al registro $fp y b y c son variables globales en las direcciones 1000 y 1001, se puede traducir como:
Uno de los objetivos que suele perseguirse es reducir al mínimo el numero de registros utilizados. En nuestro caso, podemos emplear dos: Codigo objeto final