Está en la página 1de 2

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

También podría gustarte