You are on page 1of 277

CSC (C# Compiler)

Ejercicio de Implementacin
Compiladores
Entrega Final

Curso 2003 - 2004

Septiembre del 2004

Grupo 98
Santiago Gonzlez Tortosa
Germn Ramos Garca
Alberto Fernndez Recio

sgt_fi@yahoo.es
g990189@zipi.fi.upm.es
afr@iespana.es

Grupo 98

C# Compiler

NDICE
1

INTRODUCCIN..............................................................................................................................4

ANALIZADOR LXICO..................................................................................................................6

2.1

GRAMTICA DEL ANALIZADOR LXICO.....................................................................................6

2.2

DISEO DEL ANALIZADOR LXICO.............................................................................................8

2.2.1

Autmata...............................................................................................................................8

2.2.2

Flex......................................................................................................................................10

TABLA DE SMBOLOS..................................................................................................................13
3.1

DISEO......................................................................................................................................13

3.2

IMPLEMENTACIN.....................................................................................................................14

3.3

EJEMPLO....................................................................................................................................16

ANALIZADOR SINTCTICO......................................................................................................18
4.1

GRAMTICA..............................................................................................................................19

4.2

IMPLEMENTACIN.....................................................................................................................22

ANALIZADOR SEMNTICO.......................................................................................................23
5.1

COMPROBACIN DE TIPOS........................................................................................................23

5.2

OTRAS REGLAS SEMNTICAS...................................................................................................26

GENERADOR DE CDIGO INTERMEDIO..............................................................................28


6.1

EL MODULO TERCETOS..........................................................................................................28

6.2

EL MDULO INTERMEDIO......................................................................................................33

GENERADOR DE CDIGO FINAL............................................................................................38

GENERADOR DE ERRORES.......................................................................................................46

PROGRAMA PRINCIPAL.............................................................................................................49

10

PRUEBAS.........................................................................................................................................50
10.1

PRUEBA 1..................................................................................................................................50

10.2

PRUEBA 2..................................................................................................................................61

10.3

PRUEBA 3..................................................................................................................................66

10.4

PRUEBA 4..................................................................................................................................73

10.5

PRUEBA 5..................................................................................................................................82

10.6

PRUEBA 6..................................................................................................................................91

10.7

PRUEBA 7................................................................................................................................104

Compiladores

Grupo 98

C# Compiler

10.8

PRUEBA 8................................................................................................................................119

10.9

PRUEBA 9................................................................................................................................141

10.10

PRUEBA 10..............................................................................................................................150

10.11

PRUEBA 11..............................................................................................................................154

10.12

PRUEBA 12..............................................................................................................................162

10.13

PRUEBA 13..............................................................................................................................171

10.14

PRUEBA 14..............................................................................................................................183

10.15

PRUEBA 15..............................................................................................................................186

10.16

PRUEBA 16..............................................................................................................................254

10.17

PRUEBA 17..............................................................................................................................261

10.18

PRUEBA 18..............................................................................................................................267

10.19

PRUEBA 19..............................................................................................................................268

10.20

PRUEBA 20..............................................................................................................................269

10.21

PRUEBA 21..............................................................................................................................270

10.22

PRUEBA 22..............................................................................................................................270

10.23

PRUEBA 23..............................................................................................................................271

10.24

PRUEBA 24..............................................................................................................................272

10.25

PRUEBA 25..............................................................................................................................273

11

ANEXO...........................................................................................................................................275

12

BIBLIOGRAFA............................................................................................................................276

Compiladores

Grupo 98

C# Compiler

1 Introduccin
Una compilacin es una simple traduccin que convierte un programa escrito en un
lenguaje, llamado fuente, a un programa equivalente en otro lenguaje, llamado objeto.
Las tcnicas para compilar son independientes del lenguaje fuente y objeto, es decir,
siempre es la misma.
El compilador se divide en las siguientes fases:

Analizador Lxico (AL): Lee todos los caracteres del fichero fuente y crea los
tokens oportunos, para pasrselos al analizador sintctico.

Analizador Sintctico (AS): Verifica la sintaxis del programa fuente utilizando


los tokens. Crea un rbol sintctico y se lo pasa al analizador semntico.

Analizador Semntico (ASE): Revisa la semntica del programa, a partir de un


rbol sintctico. Crea un rbol sintctico anotado y se lo pasa al generador de
cdigo intermedio.

Generador de cdigo intermedio (GCI): Crea cdigo intermedio, a partir del


rbol sintctico anotado, utilizando el lenguaje intermedio (ensamblador en este
caso).

Optimizador del cdigo (OC): Toma el cdigo intermedio y lo optimiza. Pasa al


generador de cdigo final dicho cdigo intermedio optimizado.

Generador de cdigo final (GCF): A partir del cdigo intermedio optimizado,


crea el cdigo objeto final y lo inserta en el fichero objeto.

Junto con estas fases, debemos incluir el tratamiento de errores (gestor de errores) y la
tabla de smbolos.

Gestor de errores (GE): Captura y enva por pantalla todos los errores detectados
en cada una de las fases anteriores.

Tabla de smbolos (TS): Almacena todas las palabras reservadas e


identificadores (variables, funciones, etc.), sus atributos. Tambin da
informacin a cualquiera de las fases que lo pida.

Resumiendo, un esquema de compilador puede ser el siguiente:

Compiladores

Grupo 98

C# Compiler

TS

PF

LF

AL

token

arbol
AS

ASE
sintactico

arbol. sint.
anotado

GCI

LI

OC

LI

GCF

LO

PO

Optimizado

GE

En nuestro caso tendremos todos estos pasos exceptuando el Optimizador de Cdigo, es


decir, pasamos de cdigo intermedio (GCI) a cdigo objeto final (GCF). A continuacin
veremos cada uno de ellos.
Debemos resaltar que, despus de dos anteriores entregas en el curso, en los que hemos
estado utilizando distintas alternativas de programacin, hemos decidido utilizar para
esta ltima entrega, el programa FLEX para el analizador lxico y ninguna herramienta
para el analizador sintctico y semntico.
Por otro lado, inicialmente pensamos en realizar el compilador disendolo orientado a
objetos. Sin embargo, debido a problemas con FLEX y C++, hemos optado por realizar
todo el compilador utilizando un diseo estructurado.

Compiladores

Grupo 98

C# Compiler

2 Analizador Lxico
En primer lugar, y antes de explicar el diseo de un analizador lxico, comentar una
serie de conceptos:

Un token es cada uno de los elementos de un lenguaje con significado propio.


Son smbolos terminales del analizador sintctico.
Un patrn es una regla que describe un conjunto de cadenas de entrada para los
cuales se produce como salida el mismo token.
Un lexema es una secuencia de caracteres que concuerda con el patrn de un
token.

Una vez claros estos conceptos, podemos definir un analizador lxico como el
analizador que pasa de un fichero lleno de caracteres a un conjunto de tokens que ira
pasando al analizador sintctico (uno a uno). Las funciones del analizador lxico, pues,
son:

Manejar el fichero fuente.


Leer smbolo a smbolo, de principio a fin, sin retroceder, el fichero fuente.
Localizar palabras del lenguaje y construir el token.
Eliminar caracteres que no aportan ninguna informacin (comentarios, etc.)
Rellenar informacin en la tabla de smbolos

Utilizando, pues, una Gramtica Regular (de tipo 3), y transformndola en un autmata
finito determinista, podemos detectar palabras del lenguaje del fichero fuente.

2.1 Gramtica del Analizador Lxico


El analizador lxico se apoya para poder hacer la concordancia de lexemas con tokens
en una gramtica tipo 3. Esta gramtica es la siguiente, siendo S el axioma inicial:
S +A | -B | *C | /D | %E | &F | ( | ) | { | } | [ | ] | G | ; | , | aH | . | delS
| !L | >M | <N | =O | dQ | 0R | |U | Console.V
A= |
B=|
C=|
D = | *J | /I |
E=|
F&
G ocG |
H lP | dP | @P |
I oc1I | nlS
J oc2J | *K
K oc3J | *K | /S
Compiladores

Grupo 98

C# Compiler

L=|
M=|
N=|
O=|
P aH | dH |
Q dQ |
R xT | XT | dQ |
T dxT |
U|
V wW | rX
W rite
X ead
Los smbolos auxiliares utilizados son los siguientes:
Regla S: a y del
o a: letras, @ o _ (primer carcter de un identificador).
o del: delimitadores (espacios, tabuladores...).
Regla G: oc
o oc: otro carcter salvo el de fin de fichero,nueva lnea y comillas () (los string
ocupan una sla lnea).
Regla H: l,d
o l: letras maysculas y minsculas.
o d: dgitos.
Regla I: oc1,nl
o oc1: otro carcter salvo nueva lnea (comentarios // de una sla lnea).
o nl: carcter de nueva lnea.
Regla J: oc2
o oc2: Otro carcter salvo el * y fin de fichero.
Regla K: oc3
o oc3: Otro carcter salvo * , / y fin de fichero
Regla P: a
o a: Mismo valor de la regla S.
Regla R: el smbolo X es no terminal ya que podemos encontrarnos con 0x o 0X.
Regla T: dx
o dx: Dgitos hexadecimales.
Se puede observar que es una gramtica ambigua y sabemos que los analizadores
lxicos no pueden trabajar con gramticas de estas caractersticas. Al construir el
autmata finito y el analizador lxico se utilizarn diversas tcnicas para evitar
cualquier tipo de ambigedad en el reconocimiento de los tokens.

Compiladores

Grupo 98

C# Compiler

2.2 Diseo del Analizador Lxico


2.2.1

Autmata

El autmata finito determinista creado a partir de la grmatica comentada anteriormente


es el siguiente:

Las abreviaturas utilizadas en el autmata son las siguientes:


FL = Fin de linea
del = Delimitador: Espacio, Tabulador, FL
oc = otro carcter
d = dgito
L = letra
dH = dgito hexadecimal

Acciones semnticas

Utilizacin de acciones estndar:


En todas las transiciones se lee el siguiente carcter salvo en las que no necesitamos
conocer dicho carcter ya que podemos identificar el token sin ninguna duda (ejemplo
los smbolos , . ; etc...). En las transiciones no previstas generamos un error.

Compiladores

Grupo 98

C# Compiler

Concatenamos en aquellas transiciones en las que es necesario conocer el lexema del


smbolo ledo para poder generar su token. El haber ahorrado estados finales para
facilitar la claridad del dibujo nos obliga a concatenar para poder identificar qu
operador hemos ledo y por tanto el token a generar, los identificadores y palabras
reservadas es necesario siempre concatenar y en el caso de los nmeros tambin.
Utilizacin de acciones predefinidas:
Transicin
0-1

Accin Semntica
L

2-3

2-4

5-4
5-6
10-11
12-13
14-15
16-17

-----C

16-18

24-26
25-26

19-20
22-23

---

Compiladores

Acciones
Si
n = ( GENERAR_TOKEN (PAA,_)
Si
n = ) GENERAR_TOKEN (PAC,_)
Si
n = { GENERAR_TOKEN (LLA,_)
Si
n = } GENERAR_TOKEN (LLC,_)
Si
n = [ GENERAR_TOKEN (CA,_)
Si
n = ] GENERAR_TOKEN (CC,_)
Si
n = ; GENERAR_TOKEN (DPC,_)
Si
n = , GENERAR_TOKEN (DC,_)
Si
n = . GENERAR_TOKEN (OP,_)
Si
n = + GENERAR_TOKEN (OA,1)
Si
n = - GENERAR_TOKEN (OA,2)
Si
n = * GENERAR_TOKEN (OA,3)
Si
n = % GENERAR_TOKEN (OA,5)
Si
n = += GENERAR_TOKEN (AO,1)
Si
n = -= GENERAR_TOKEN (AO,2)
Si
n = *= GENERAR_TOKEN (AO,3)
Si
n = %= GENERAR_TOKEN (AO,5)
GENERAR_TOKEN (AO,4)
GENERAR_TOKEN (OA,4)
GENERAR_TOKEN (OL,1)
GENERAR_TOKEN (OL,2)
GENERAR_TOKEN (ST,n)
Si
n = ! GENERAR_TOKEN (OL,3)
Si
n = > GENERAR_TOKEN (OL,4)
Si
n = < GENERAR_TOKEN (OL,5)
Si
n = = GENERAR_TOKEN (OAS,_)
Si
n = != GENERAR_TOKEN (OL,9)
Si
n = >= GENERAR_TOKEN (OL,8)
Si
n = <= GENERAR_TOKEN (OL,7)
Si
n = == GENERAR_TOKEN (OL,6)
Si n = Palabra_Reservada
GENERAR_TOKEN (PR,n)
En otro caso:
p := BUSCA (n)
Si p = NULL
p := AADE (n)
GENERAR_TOKEN (ID,p)
GENERAR_TOKEN (CE,n)
GENERAR_TOKEN (CE,n)

Grupo 98

2.2.2

C# Compiler

Flex

La implementacin de la gramtica la realizamos utilizando el programa FLEX (Free


LEX). Utilizando varios manuales de Flex, aprendimos a implementar las gramticas
capaces de localizar palabras del lenguaje y construir los tokens de un fichero fuente.
Primeramente, debemos comentar el formato general de un fichero de (F)Lex:
{definiciones}
%%
{ordenes}
%%
{subrutinas del usuario}
En cada apartado se realiza la siguiente implementacin:

Definiciones: se definen los patrones a utilizar en la gramtica.


Ordenes: Se define la secuencia de rdenes a ejecurtarse si se encuentra un
lexema que concuerda con uno de los patrones definidos anteriormente.
Subrutinas del usuario: funciones y mtodos implementados por el usuario, que
realizan una serie de operaciones al lexema. Un ejemplo claro de funcin es la
generacin del token.

Utilizando la documentacin de Flex, la gramtica anterior e implementando las


acciones semnticas como funciones, obtenemos el analizador lxico. La
implementacin se realiz en el fichero lexer2.l, archivo donde se sita toda la
gramtica del analizador.
Para facilitar la labor en el analizador semntico, incluimos como palabras reservadas
los comandos Console.Read y Console.Write, aunque no lo incluimos como tal en el
diseo del analizador lxico.
Por otro lado, incluimos los tokens ? y : en la implementacin del analizador lxico,
por si daba tiempo a realizar el Operador Condicional en el compilador. Como no dio
tiempo, no lo incluimos en el diseo del analizador lxico.
En definitiva, los tokens implementados con FLEX han sido:
Lista de Tokens
<PR, ptr(tabla)>
<PR, ptr(tabla)>
<OA, ptr(tabla)>
<OAS, ->
<PAA, ->
<PAC, ->

Compiladores

Palabra Reservada (0)


Palabra Reservada (0)
Operador Aritmtico (1)
Operador de Asignacin (=) (2)
Parntesis Abierto (() (3)
Parntesis Cerrado ()) (4)

10

Grupo 98

C# Compiler

<LLA, ->
<LLC, ->
<OL, ptr(tabla)>
<CE, valor>
<AO, ptr(tabla)>
<CA, ->
<CC, ->
<OP, -)>
<OC, ptr(tabla)>
<ST, ptr(tabla)>
<ID, ptr(tabla)>
<DPC, ->
<DC, ->
<IC, ->
<FC, ->
<EOF, ->
<CCR, ->
<CCW, ->

Llave Abierta ({) (5)


Llave Cerrada (}) (6)
Operador Lgico (7)
Constante Entera (8)
Asignacin de Operacin (9)
Corchete Abierto ([) (10)
Corchete Cerrado (]) (11)
Operador Punto (12)
Operador Carcter (13)
ID de cadena de caracteres () (14)
ID (variable o funcin) (15)
Delimitador de Punto y Coma (;) (16)
Delimitador de Coma (,) (17)
Inicio Condicion (?) (18)
Inicio Condicion (:) (19)
Fin de Fichero (20)
Comando Console.Read (21)
Comando Console.Write (22)

Tabla de Operadores Aritmticos


Puntero
1
2
3
4
5

Elemento
+
*
/
%

Tabla de Operadores Lgicos


Puntero
1
2
3
4
5
6
7
8
9

Elemento
&&
||
!
>
<
==
<=
>=
!=

Tabla de Operadores de Asignacin de Operacin


Puntero
1
2
3
4
Compiladores

Elemento
+=
-=
*=
/=
11

Grupo 98

C# Compiler

5
6
7

%=
++
--

Tabla de Palabras Reservadas


Puntero
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Compiladores

Elemento
IF
ELSE
RETURN
TRUE
FALSE
VOID
STRING
SHORT
BOOL
CLASS
REF
NEW
PUBLIC
PRIVATE
STATIC
SET
GET
VALUE
PARAMS

12

Grupo 98

C# Compiler

3 Tabla de Smbolos
3.1 Diseo
El Diseo de la tabla de smbolos se ha realizado utilizando una metodologa
estructurada. Para ello, primero definimos la estructura de la tabla de smbolos:
Una tabla de smbolos es un conjunto de elementos ordenados de una forma concreta,
en nuestro caso, utilizando listas doblemente enlazadas. Dichos elementos pueden ser:

CLAVE: Palabra reservada (0)


SHORT: Tipo entero (1)
STRING: Tipo cadena de caracteres (2)
BOOL: Tipo booleano (3)
VOID: Tipo desconocido (4)
CLASE: Tipo clase (o bien instanciacin de una clase ya creada) (5)
FUNCION: Tipo mtodo (6)
LISTA SHORT: Lista de enteros (7)
LISTA STRING: Lista de cadena de caracteres (8)
LISTA BOOL: Lista de bolanos (9)
LISTA VOID : Lista de tipos desconocidos (10)
OTRO: Otro tipo (Console.Write, por ejemplo) (11)

Para cada tipo de elemento, se necesitaran, pues, ciertos campos:

pu_pr: Entero que indica si el elemento es publico (1) o privado (0)


estatico: Estar a 1 si el elemento es static
nombre: Nombre del elemento
tipo: Entero que indica que tipo de elemento es.
tipo_clase: Indica el nombre de la clase al que esta instanciando el elemento
num_eltos: Numero de elementos de un elemento lista.
valor: Estar a 1 si el elemento tiene valor (esta inicializado) o no.
eti: Indica el nmero de etiqueta asignada al mtodo o clase por el generador de
cdigo intermedio.
tipo_valor_devuelto: Indica el tipo del valor devuelto, en caso de que el
elemento sea un mtodo.
numero_parametros: Indica el numero de parmetros de un metodo.
Parmetros: Lista enlazada de los parametros
Subtabla: Direccion donde se situa la subtabla, en caso en que el elemento sea
una clase o un metodo.

La estructura de los parmetros consiste en una lista enlazada de parmetros, los cuales
contienen campos: tipo del parmetro y el paso del parmetro, es decir, por valor (1) o
por referencia (2).

Compiladores

13

Grupo 98

C# Compiler

3.2 Implementacin
El modulo implementado es tsimbolos, el cual permite la siguiente interfaz de usuario:

TS *Crear_Tabla(TS* padre);

Crea una tabla de smbolos, cuyo padre asociado es el argumento de la funcin.

void Borrar_Tabla(TS *tabla);

Borra la tabla de smbolos indicado en el argumento

int Esta_Lexema(TS *tabla,char* nombre);

Devuelve 0 si el elemento con el nombre del argumento se encuentra en la tabla del


argumento de la funcion. En caso contrario, devuelve -1.

int Insertar_Lexema(TS *tabla,char *nombre, int tipo);

Inserta un elemento con el nombre y el tipo indicadas, en la tabla de smbolos


indicada en el argumento de la funcion1.

int Insertar_Categoria_Lexema(TS *tabla,char *nombre, int


publico, int privado, int estatico);

Inserta las categoras de un elemento determinado en una tabla determinada. Dichas


categoras son: publico, privado y estatico. Por defecto siempre es privado.

int Borrar_Lexema(TS *tabla,char *nombre);

Borramos un elemento de una tabla de smbolos.

int Dibujar_Tabla(TS *tabla,char *fichero);

Imprime por fichero la tabla de smbolos indicada como argumento.

int Insertar_Valor_Lexema(TS *tabla,char *nombre);

Activa el campo valor (a 1) del elemento perteneciente a una tabla.


int Insertar_Eti(TS *tabla,char *nombre);
Inserta el numero de etiqueta del mtodo o clase.

int Insertar_Tipo_Valor_Devuelto(TS *tabla,char *nombre, int


tipo);

Inserta el tipo del valor devuelto del elemento de una tabla de smbolos. Por tanto,
dicho lexema debe ser un metodo.

int Insertar_Parametro(TS *tabla,char *nombre, int tipo_par, int


paso_par, char *clase);

Inserta un parmetro en la lista de parmetros de un elemento de una tabla de


smbolos determinada.

TS *Crear_Subtabla(TS *tabla,char *nombre);

Crea una subtabla a partir de un elemento de una tabla de smbolos determinada.


Nos devuelve su puntero.

int Dar_Tipo(TS *tabla,char* nombre);

En la mayora de las funciones de este tipo, devolvern 0 si todo ha salido bien y -1 en caso contrario.

Compiladores

14

Grupo 98

C# Compiler

Nos devuelve el tipo de un elemento de una tabla de smbolos determinada.

int Cambiar_Tipo(TS *tabla,char *nombre, int tipo);

Nos permite cambiar el tipo de un elemento de la tabla de smbolos.

int Dar_Valor(TS *tabla,char* nombre);

Nos indica si el elemento de la tabla de smbolos esta inicializado con valor o no.

int Dar_Tipo_Valor_Devuelto(TS *tabla,char *nombre);

Nos devuelve el tipo del valor devuelto del elemento de una tabla de smbolos
determinada. Por tanto, dicho elemento debe ser un metodo.

int Tipo_Clase(TS *tabla,char *nombre, char *clase);

Insertamos cual es la clase a la cual el elemento se instancia, dentro de una tabla de


smbolos determinada.

char *Dar_Tipo_Clase(TS *tabla,char *nombre);

Devuelve la clase a la cual el elemento esta instanaciando.

TS *Padre(TS *tabla);

Devuelve el puntero a la tabla de smbolos Padre, de una tabla de smbolos


determinada.

TS *Subtabla(TS *tabla,char *nombre);

Nos devuelve el puntero a la subtabla de smbolos de un elemento de una tabla de


smbolos determinada.

int Insertar_Reservadas(TS *tabla);

Inserta todas las palabras reservadas en una tabla de smbolos.

int Dar_Tipo_Parametro(TS *tabla,char *nombre, int i);

Devuelve el tipo del parmetro de posicin i de la lista de parmetros de un


elemento de una tabla de smbolos determinada.

TS * Dar_Subtabla_Metodo(TS *t, char *nombre);

Devuelve el puntero a una subtabla de un elemento que es un metodo. Dicho


elemento se encuentra en una tabla de smbolos determinada.

int Insertar_Tamamo(TS *tabla,char *nombre, int tam);

Inserta el tamao de la lista de un elemento de tipo Lista de una tabla de smbolos


determinada.

int Es_Publico(TS *tabla, char *nombre);

Devuelve 0 si el elemento de la tabla es publico. En caso contrario, devuelve -1.

Compiladores

15

Grupo 98

C# Compiler

3.3 Ejemplo
A continuacin, para comprobar el funcionamiento de la Tabla de Smbolos, incluimos
el cdigo de la funcin main.cpp con su correspondiente solucin.
#include tsimbolos.h"
int main() {
TS *t,*tfuncion;
t = Crear_Tabla(NULL);
Insertar_Lexema(t,"numero1",SHORT);
Insertar_Valor_Lexema(t,"numero1");
Insertar_Lexema(t,"identificador1",SHORT);
Cambiar_Tipo(t,"identificador1",STRING);
Insertar_Valor_Lexema(t,"identificador1");
Insertar_Lexema(t,"funcion1",FUNCION);
Insertar_Valor_Lexema(t,"funcion1");
Insertar_Tipo_Valor_Devuelto(t,"funcion1",SHORT);
Insertar_Parametro(t,"funcion1",BOOL,NORMAL);
Insertar_Parametro(t,"funcion1",SHORT,REF);
Insertar_Parametro(t,"funcion1",BOOL,REF);
Insertar_Lexema(t,"identificador2",STRING);
Insertar_Valor_Lexema(t,"identificador2","apellido");
Insertar_Lexema(t,"numero1",SHORT); //No lo inserta por repetido
tfuncion = Crear_Subtabla(t,"funcion1");
Insertar_Lexema(tfuncion,"numero2",SHORT);
Insertar_Valor_Lexema(tfuncion,"numero2");
Insertar_Lexema(tfuncion,"identificador3",STRING);
Insertar_Valor_Lexema(tfuncion,"identificador3");
Dibujar_Tabla(t,"salida.txt");
}

return 0;

A continuacin representamos su solucin, es decir, las tablas de smbolos en ficheros


de texto:

Fichero salida.txt

LEXEMA: numero1
Tipo: SHORT
Valor: 1
------------------------------------------------

Compiladores

16

Grupo 98

C# Compiler

LEXEMA: identificador1
Tipo: STRING
Valor: 1
-----------------------------------------------LEXEMA: funcion1
Tipo: FUNCION
Valor: 1
Tipo valor devuelto: SHORT
Numero de parametros: 3
Parametros:
Tipo parametro: BOOL
Paso de parametro: NORMAL
Tipo parametro: SHORT
Paso de parametro: POR REFERENCIA
Tipo parametro: BOOL
Paso de parametro: POR REFERENCIA
Este Lexema contiene una SUBTABLA
-----------------------------------------------LEXEMA: identificador2
Tipo: STRING
Valor: 1
------------------------------------------------

Fichero funcion1.txt

LEXEMA: numero2
Tipo: SHORT
Valor: 1
-----------------------------------------------LEXEMA: identificador3
Tipo: STRING
Valor: 1
------------------------------------------------

Compiladores

17

Grupo 98

C# Compiler

4 Analizador Sintctico
Dado un conjunto de Tokens (dado por el analizador lxico), el analizador sintctico
debe, utilizando una gramtica de tipo LL(1), generar un Autmata Finito No
Determinista (AFN), realizar un recorrido descendente recursivo y generar un rbol
sintctico.
Se define una gramtica de tipo LL(1) como la gramtica que cumple las siguientes
propiedades:
Dado A = ||. Se debe cumplir que:
first() . first() = {} .
first() . first() = {} .
first() . first() = {}.
Dado A =(|). Se debe cumplir que:
first() . first() = {}
Dado A =(|). Se debe cumplir que:
first() . follow(A) = {}
FIRST(X)
Si es cualquier cadena de smbolos gramaticales, se considera FIRST() como el
conjunto de terminales que encabezan las cadenas derivadas de . Si =*=> , entonces
tambin est en FIRST().
Para calcular FIRST(X) para algn smbolo X de la gramtica, se aplican las siguientes
reglas hasta que no se pueda aadir nada nuevo al conjunto FIRST:
1. Si X es terminal, entonces FIRST(X) es {X}.
2. Si X es no terminal y existe la produccin X , entonces aadir a FIRST(X).
3. Si X es no terminal y X Y1 Y2 .. . Yk es una produccin entonces, para todo i
(con i variando desde 1 hasta k) tal que Y1 , Y2 , ..., Yi-1 sean todos no terminales y
FIRST(Y1), FIRST(Y2), ..., FIRST(Yi-1) contengan todos , se aaden todos los
smbolos no nulos de FIRST(Yi ) a FIRST(X). Finalmente, si est en FIRST(Yj )
para j = 1, 2, ..., k (o sea, en todos), entonces se aade a FIRST(X).
Dicho de otra forma, lo anterior significa que todos los elementos de FIRST(Y1),
excepto , pertenecen tambin a FIRST(X). Si Y1 no deriva , entonces ya ha
terminado el clculo de FIRST(X), pero en caso contrario, es decir, si Y1=*=> ,
entonces todos los elementos de FIRST(Y2) excepto pertenecen tambin a
FIRST(X), y as sucesivamente. Finalmente, si todos los Yi derivan , entonces
se aade a FIRST(X).

Compiladores

18

Grupo 98

C# Compiler

FOLLOW(A)
Se define FOLLOW(A), para el no terminal A, como el conjunto de terminales a que
pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial, es decir,
el conjunto de terminales a tal que haya una derivacin de la forma S=*=>Aa para
algn y . Si A puede ser el smbolo de ms a la derecha en alguna forma sentencial,
entonces $ est en FOLLOW(A).
Para calcular FOLLOW(A) para un smbolo no terminal A, se aplican las siguientes
reglas hasta que no se pueda aadir nada ms al conjunto FOLLOW.
1. $ est en FOLLOW(S), siendo S el axioma de G.
2. Si existe una produccin A B, entonces todo lo que est en FIRST(),
excepto , est en FOLLOW(B).
3. Si existe la produccin A B y FIRST() contiene (es decir, =*=>), o
bien si existe una produccin A B, entonces todo lo que est en FOLLOW(A)
est en FOLLOW(B).
Se puede considerar el anlisis sintctico descendente como un intento de encontrar una
derivacin por la izquierda para una cadena de entrada. Tambin se puede considerar
como un intento de construir un rbol de anlisis sintctico para la entrada comenzando
desde la raz y creando los nodos del rbol en orden previo.
A continuacin representaremos la gramtica del Analizador Sintactico.

4.1 Gramtica
Primeramente hicimos una gramtica sencilla que cumpliera las normas para LL(1). A
medida que incluamos mas reglas, nos iban apareciendo nuevas dependencias.
Finalmente, utilizando una serie de tcnicas pudimos eliminar dichas dependencias y
crear una gramtica de tipo LL(1).
Una vez que tuvimos la gramtica correcta, la modificamos para que se pareciera al
mximo a la gramtica utilizada para la implementacin. Sustituimos los smbolos
terminales por definiciones, que posteriormente comentamos, para que la gramtica se
parezca lo mximo posible a la implementacin.
La gramtica es la siguiente:
Sintactico PR_CLASS Clase Sintactico
Sintactico EO
Clase ID LLA DeclSentencias LLC
Compiladores

19

Grupo 98

C# Compiler

Clase
DeclSentencias DeclSentencia DeclSentencias
DeclSentencias
DeclSetencia [(PR_PUBLIC | PR_PRIVATE )] [STATIC] Sentencia
Sentencia ID [Var] (SentAsig DPC | SentMet DPC | DPC | ID Declaracion)
Sentencia PR_IF Expresin ( Sentencia | LLA SentenciaS LLC)
[PR_ELSE ( Sentencia | LLA SentenciaS LLC)]
Sentencia PR_RETURN Expresin DPC
Sentencia Tipos [LLA LLC] ID Declaracion
Sentencia CCW PAA (ID [Var] | ST) [DC DatosWrite] PAC DPC
Var OP ID [SentMet]
Var CA Expresin CC
SentenciaS Sentencia Sentencias
SentenciaS
SentAsig OAS Valor
SentAsig AO Expresion
SentMet PAA (PAC | Var2 PAC)
DatosWrite DC Valor DatosWrite
DatosWrite
Tipos (PR_SHORT | PR_STRING | PR_VOID | PR_BOOL)
Valor
Valor
Valor
Valor

CCR PAA PAC


PR_NEW Tipos CA CE CC
LLA Primario Valores LLC
Expresion

Var2 Expresin Var3


Var3 DC Expresin Var3
Var3
Valores DC Primario Valores
Valores
Primario ST | OC | CE | PAA Expresin PAC | PR_TRUE | PR_FALSE
| PR_VALUE | ID [Var] [SentMet]
Expresion Condicion [Expresion2]
Compiladores

20

Grupo 98

C# Compiler

Expresion2 (OL_AND | OL_OR) Expresion


Condicion ExprSimple [Condicion2]
Condicion2 (OL_MAYOR | OL_MENOR | OL_IGUAL | OL_MEN_IGU
| OL_MAY_IGU | OL_DIST) ExprSimple
ExprSimple [(Suma | Resta)] Termino [ExprSimple2]
ExprSimple2 (Suma | Resta) Termino
Termino Factor [Termino2]
Termino2 (Producto | Division | Modulo) Factor Termino2
Termino2
Factor [OL_NOT] Primario
Declaracion
Declaracion
Declaracion
Declaracion
Declaracion

PAA TiposMet PAC DeclMetodo


LLA DeclAtributo LLC
OAS Valor Declaracion
DC Decl2 DPC
DPC

TiposMet [PR_REF] PR_PARAMS Tipos CA CC ID TiposMet2


TiposMet [PR_REF] (Tipos | ID) ID TiposMet2
TiposMet2 DC TiposMet
TiposMet2
DeclMetodo LLA SentenciaS LLC
DeclAtributo PR_GET DeclAtributo2
DeclAtributo PR_SET DeclAtributo4
DeclAtributo2 LLA SentenciaS LLC DeclAtributo3
DeclAtributo4 LLA SentenciaS LLC DeclAtributo5
DeclAtributo3 PR_SET LLA SentenciaS LLC
DeclAtributo3
DeclAtributo5 PR_GET LLA SentenciaS LLC
DeclAtributo5

Compiladores

21

Grupo 98

C# Compiler

Decl2 CA CC ID Decl22 Decl21


Decl2 ID Decl22 Decl21
Decl22 OAS Valor
Decl22
Decl21 DC Decl2
Decl21
Cada palabra en negrita es un Smbolo No Terminal, y por tanto genera rama. Cada
rectangulo pertenece a un Smbolo No Terminal.
Los smbolos terminales son:

PR Palabra Reservada
OA Operador Aritmetico
OAS = (Operador ASignacion)
PAA ( (PArntesis Abierto)
PAC ) (PArntesis Cerrado)
LLA { (LLave Abierta)
LLC }(LLave Cerrada)
OL Operador Logico
CE Entero
AO Asignacion con Operador
CA [ (Corchete Abierto)
CC ] (Corchete Cerrado)
OP . (Operador Punto)
OC character (Operador Caracter)
ST STring (conjunto de caracteres)
ID IDentificador
DPC ; (Delimitador Punto y Coma)
DC , (Deliminator Coma)
EO Fin de Fichero (EOF)
CCR = Console.Read
CCW = Console.Write

4.2 Implementacin
En la implementacin del analizador sintctico no utilizamos ninguna herramienta, ya
que la nica valida era COCO/R y no nos convenca del todo para realizar el resto de
pasos (analizador semntico, generador de cdigo intermedio, etc.).
Simplemente sustituimos los smbolos no terminales por nombres de funcin, cuyo
cuerpo de la misma es encajar los tokens leidos con cada regla de la gramtica. En caso
de no encajar, se produce un error, lo que conlleva a avisar al gestor de errores, que mas
adelantes hablaremos de el.

Compiladores

22

Grupo 98

C# Compiler

5 Analizador Semntico
Este apartado lo vamos a dividir en dos subapartados: Por un lado vamos a comentar
como se ha realizado la comprobacin de tipos y por otro como se han realizado el resto
de reglas semnticas.
Primeramente, debemos comentar que todo el anlisis semntico se ha realizado por
traduccin, es decir, utilizando Esquema de Traduccin (EDT) y no dirigida por
sintaxis, como es lgico en analizadores sintcticos descendentes.
Como es obvio, la inclusin de reglas semnticas se implementa utilizando cdigo en
C++. A continuacin vemos todas las comprobaciones semnticas realizadas en el
compilador.

5.1 Comprobacin de Tipos


En la comprobacin de tipos, realizamos las siguientes comprobaciones:

Comprobacin de tipos en Id: Existen dos posibilidades:


o Declaracin de un Id:

Comprobar que dicho Id no esta declarado en la misma tabla de


smbolos.

Comprobar que tiene una declaracin correcta (tal y como indica


el sintactico). Tener en cuenta el tipo de declaracin (metodo,
clase, variable, atributo).

Insertar en la tabla de smbolos dicho Id con el tipo especifico. En


caso de ser un mtodo, insertar el tipo del valor devuelto. En caso
de ser una instanciacin de una clase, insertar el nombre de la
clase instanciada.

o Uso de un Id o Variable (Id con campos):

Compiladores

Debemos comprobar que el Id ya ha sido declarado


anteriormente, o bien en la tabla de smbolos, o bien en la tabla
de smbolos padre, o bien en la tabla de smbolos de hermanos ya
generadas. Debemos devolver el tipo del Id.

En caso de estar el Id despus de un operador de asignacin (=)


debemos comprobar que dicha variable ya este inicializada.

Puede darse el caso en que la Variable sea un objeto y se intente


acceder a un atributo de dicho objeto (operador .). Por tanto, lo
primero que debemos mirar a que clase se refiere dicho objeto.
23

Grupo 98

C# Compiler

Una vez que se sabe la clase, debemos mirar el tipo del atributo
de dicha clase. Lo que devolvemos en este caso seria el tipo del
atributo. En caso de no tener declarada la clase del objeto, o de no
existir el atributo, generaramos un error.

Puede darse el caso en que se trate de un acceso a un elemento de


un vector (operador [ ]). Por tanto, debemos asegurarnos de que
la Expresin incorporada entre los corchetes sea de tipo Short. En
este caso devolvemos el tipo del vector de elementos, es decir, si
se trata de un vector de shorts, devolveramos el tipo short.

Comprobacin de tipos en una Expresin:


o Una expresin se divide en un conjunto de condiciones. Una condicin
se divide en un conjunto de expresiones simples. Una expresin simple
se divide en un conjunto de trminos. Un trmino esta formado por un
conjunto de factores. Un factor esta formado por un solo elemento
Primario (con posible negacin). Un elemento primario puede ser de
varios tipos.
o La comprobacin de tipos para cada una de las partes es:

Compiladores

Expresin: Si hay mas de uno, los tipos de las condiciones deben


ser iguales y deben ser de tipo Booleano.
Condicin: Si hay mas de una, los tipos de las expresiones
simples deben ser iguales. En caso de ser de tipo short, la
condicin se transforma a tipo booleano. En caso de ser tipo
booleano, obligatoriamente los operadores deben ser == y !=
ExprSimple: Si hay mas de uno, los tipos de los trminos deben
ser iguales y de tipo Short.
Termino: Si hay mas de uno, los tipos de los factores deben ser
iguales y de tipo Short.
Factor: Solo puede haber un elemento primario. Si hay negacin,
el elemento primario debe ser booleano. Sino la hay, puede ser
cualquier tipo.
Primario: puede ser
Cadena: tipo string
Var (posibilidad de ser llamada a mtodo): el propio tipo
de la variable. Caso de ser un mtodo, el tipo devuelto del
mtodo es el tipo del elemento primario.
Decimal: debemos verificar que el decimal no se pase de
216 (16 bits) para que sea de tipo Short
Hexadecimal: Lo mismo que el anterior, pero teniendo en
cuenta que es hexadecimal.
( Expresin ): Es el tipo de de propia Expresin.
true: tipo booleano
false: tipo booleano.

24

Grupo 98

C# Compiler

value: el tipo que indique el atributo utilizado en ese


momento (se utiliza una variable global que toma valor
cuando un atributo se define).

Comprobacin de tipos en una Sentencia: Toda sentencia devuelve un tipo que


indica si la sentencia tiene los tipos correctos (tipo = 0) o no (tipo = -1).
Debemos diferencias varios tipos de sentencias:
o Declaraciones: Existen tres tipos de Declaraciones. La declaracin ser
correcta si los tipos de la declaracin lo son y coinciden con sus posibles
valores.

Atributos: Los atributos tienen un tipo de inicio. En este caso, se


utiliza la variable global tipo_value que indica el tipo al elemento
primario value.
Mtodos: Lo vemos mas adelante.
Variables: Debemos tener en cuenta que todas las variables
declaradas en una misma declaracin tienen el mismo tipo.

En caso de declarar un objeto, debemos comprobar que la


variable que funciona como Tipo, es una variable de tipo
clase. Una vez hecho eso, insertamos como clase del
objeto el nombre de dicha variable.

Debemos comprobar que todos los valores asignados en la


declaracin de cada variable coincidan con el tipo de la
propia declaracin.

o Asignaciones: Debemos comprobar que el tipo de la Variable coincida, o


bien con el tipo del Valor asignado, o bien sea de tipo Consola (lectura de
caracteres, de tipo short). Como hemos comentando anteriormente, todas
las variables puestas en el lado derecho de la asignacin, deben estar
inicializadas de valor.
o Sentencias if/then/else: La estructura es de tipo if EXPRESION
{sentencias} else {sentencias}. Por tanto, se debe cumplir que la
expresin es de tipo booleana (es una condicin) y que todas las
sentencias tengan correctos sus tipos, para que esta sentencia sea
correcta.
o Sentencias de Consola Write: nicamente debemos verificar que el
primer argumento sea de tipo string (sea una cadena de caracteres o una
variable) y que pueda contener cualquier variable de cualquier tipo. El
tipo de esta sentencia es otro.
o Sentencias de Consola Read: Obligatoriamente esta sentencia devuelve
un entero, que es el entero ledo de entrada estandar.

Compiladores

25

Grupo 98

C# Compiler

o Retornos: Los retornos devuelven cualquier Expresin. El tipo de la


expresin debe coincidir, o bien con el retorno del mtodo que incluye
dicha sentencia, o bien con el tipo del atributo que la incluye (que es
donde se suele utilizar este tipo de sentencias). Si coinciden los tipos, la
sentencia ser correcta.

Comprobacin de tipos en un Mtodo: En este caso debemos comprobar los


siguientes tipos:
o Modificacin del tipo del identificador. El tipo insertado anteriormente
es el tipo del valor devuelto por el mtodo.
o parmetros: Incluir como nuevas variables (con su tipo correspondiente)
en la nueva tabla de smbolos del mtodo declarado.
o Sentencias del interior del Mtodo: Deben ser correctas. Deben estar sus
declaraciones en una subtabla del metodo, junto a los parmetros.

Comprobacin de tipos en una Clase: Lo nico que debemos comprobar es que


todas las sentencias son correctas de tipo. Tambin, creamos una nueva subtabla
de smbolos para cada clase e insertamos en ella todos los smbolos encontrados
en las sentencias de la Clase.

5.2 Otras Reglas Semnticas


Otras comprobaciones que hacemos son las siguientes:

Comprobamos que las variables no se declaran dos veces en el mismo mtodo o


clase.

Comprobamos que no se declare un objeto de una clase que este definindose en


ese momento. Tambin se tiene en cuenta que puede estar declarndose dicho
objeto dentro de un mtodo de una clase.

Se tiene en cuenta que los nmeros decimales de tipo Short no excedan el limite
de overflow.

Se modifica la cadena de caracteres cambiando los caracteres especiales


utilizados en la misma.

Se tiene en cuenta en bsqueda de Identificadores, la herencia en Tabla de


Smbolos padres y hermanos ya creados.

En llamadas a mtodos de un objeto, comprobamos el nmero de parmetros y


el tipo de cada parmetro.

Comprobamos que solo existe un solo mtodo MAIN en todo el programa.

Compiladores

26

Grupo 98

C# Compiler

Comprobamos que los usos de variables y mtodos de objetos tengan permisos


de uso (es decir, sean pblicos).

Comprobamos el tipo de cada elemento de la lista asignada a una variable, es


decir, por ejemplo: pepe = [3,2,5] comprobamos que todos los elementos son
enteros.

Comprobamos si no hay sentencias en el uso de llaves. Es obligatorio que como


mnimo haya una sentencia entre llaves.

Comprobamos que asignaciones entre variables y llamadas a mtodos sean del


mismo tipo.

Comprobamos que la palabra reservada Value se use nicamente cuando se


encuentra en una declaracin de atributo.

Comprobamos que todos los mtodos y atributos tengan una sentencia de tipo
retorno (return). Solo se permitir que no exista esta sentencia cuando el tipo de
retorno sea VOID.

Comprobamos que no se puede declarar una clase dentro de otra.

Comprobamos que el mtodo Main debe ser publico, de lo contrario no podemos


contar con ese mtodo.

Comprobamos que los atributos y las variables estn inicializadas, ya sean desde
la propia clase o mtodo, a objetos instanciados.

Compiladores

27

Grupo 98

C# Compiler

6 Generador de Cdigo Intermedio


El generador de cdigo intermedio hace una representacin del programa en un lenguaje
intermedio, en nuestro caso en Tercetos. Esto se consigue mediante llamadas a las
funciones del generador desde el analizador sintctico. El generador de cdigo
intermedio est dividido en dos partes: Por un lado, el modulo tercetos, se encarga de
almacenar los tercetos que se van generando y por otro lado, el mdulo intermedio
hace de mediador entre el analizador sintctico y la generacin de tercetos.

6.1 El modulo tercetos


Este mdulo es el encargado de generar los tercetos y almacenarlos. Inicialmente, este
mdulo fue planificado para almacenar los tercetos en memoria mediante una lista
doblemente enlazada para que luego el optimizador y el generador de cdigo objeto ya
tuviesen los tercetos en memoria para analizarlos. Sin embargo, puesto que no hemos
implementado ningn optimizador de cdigo y hemos conseguido hacer un generador
de cdigo objeto de una pasada secuencial, finalmente decidimos no almacenar los
tercetos en memoria y almacenarlos directamente en un fichero de salida cuya nica
finalidad es comprobar el buen funcionamiento del generador de tercetos.
Las funciones proporcionadas por este mdulo son:

La estructura de los tercetos. Esta estructura est preparada para almacenar los
tercetos en memoria segn se van generando aunque como hemos explicado
antes, los tercetos se escriben directamente en un fichero y no se almacenan en
memoria. Los tercetos se componen de tres campos:
o La operacin correspondiente al terceto
o El operador1
o El operador 2
Los operadores se componen a su ven de dos campos: El tipo de operador y el
valor. El tipo puede ser numrico, cadena, o una referencia a otro terceto. El
valor es una unin capaz de almacenar cualquiera de estos tres valores.
typedef
typedef
typedef
typedef

union val_t val;


struct op_t op;
struct terceto_t terceto;
struct cola_terceto_t cola_terceto;

union val_t{
int numero;
char *cadena;
terceto *t;
};
struct op_t{
int tipo;
val valor;
};

Compiladores

28

Grupo 98

C# Compiler

struct terceto_t{
int operacion;
op op1;
op op2;
terceto *siguiente;
terceto *anterior;
};
struct cola_terceto_t{
terceto *primero;
terceto *ultimo;
};

void Iniciar_Tercetos(char *f);

Esta funcin recibe el nombre del fichero de salida donde se escribirn los
tercetos generados. Automticamente se aadir la extensin .ter al fichero
generado. Inicializa el generador de tercetos.

void Generar_Terceto(int operacion,int t1, val v1,int t2, val


v2);

Esta funcin genera los tercetos. Recibe la operacin del terceto a generar y los 2
tipos y valores de los operadores del terceto.

void Fin_Tercetos();

Informa de la finalizacion de genercin de tercetos y cierra el fichero.

int Dibujar_Op(FILE *fd,op o);

Funcin auxiliar utilizada por Generar_Terceto para escribir un operador.


Los tipos de tercetos que se pueden generar se encuentran definidos en types.h y son
los siguientes:

#define TR_INICIO_PROGRAMA 0
Terceto de inicio del programa. No recibe ningn operando.

#define TR_FIN_PROGRAMA 1
Terceto de fin del programa. No recibe ningn operando.

#define TR_METODO_MAIN 2
Terceto correspondiente con el inicio del mtodo principal Main

#define TR_METODO 3
Terceto correspondiente con el inicio de un mtodo. Recibe un operando
numrico que indica el nmero correspondiente a la etiqueta del mtodo

#define TR_METODO_RET 4
Terceto correspondiente con el fin de un mtodo. No recibe ningn operando.

#define TR_ASIGNACION 5

Compiladores

29

Grupo 98

C# Compiler

Terceto de asignacin. Recibe dos operandos numricos. El primero indica si la


variable donde se realiza la asignacin es del mtodo o de la clase, y el segundo
indica el desplazamiento correspondiente a la variable en el registro de
activacin correspondiente

#define TR_REGISTRO_CLASE 6
Crea el registro de activacin de una clase. Recibe un operando numrico que
indica el tamao del registro

#define TR_CLASE 7
Terceto correspondiente con el inicio de una clase. Recibe un operando numrico
que indica el nmero correspondiente a la etiqueta de la clase

#define TR_SALTO 8
Terceto que indica la posicin del cdigo inicial del programa. No recibe ningn
operando.

#define TR_REGISTRO_METODO 9
Crea el registro de activacin de un mtodo. Recibe un operando numrico que
indica el tamao del registro

#define TR_VALOR_INMEDIATO 10
Terceto de un valor short inmediato. Recibe un operando numrico con el valor.

#define TR_VALOR_VARIABLE 11
Terceto de acceso a una variable. Recibe dos operandos numricos. El primero
indica si la variable es del mtodo o de la clase, y el segundo indica el
desplazamiento

#define TR_WRITE_STRING 12
Terceto para escribir cadenas. Recibe un operando numrico que le facilita 2
etiquetas auxiliares y un operando cadena con el valor del string a escribir.

#define TR_WRITE_SHORT 13
Terceto para escribir enteros. Recibe un operando numrico con el valor a
escribir.

#define TR_SALTO_METODO 14
Terceto para saltar a un mtodo. Recibe un operando con la etiqueta del mtodo
al que saltar.

#define TR_INICIO_WRITE_STRING 15
Terceto que indica el inicio de escritura en consola. No recibe ningn operando.

#define TR_FIN_WRITE_STRING 16
Terceto que indica el final de escritura en consola. No recibe ningn operando.

#define TR_SUMA 17

Compiladores

30

Grupo 98

C# Compiler

Terceto que implementa los operadores aritmticos suma y resta. Recibe un


operando indicando si tiene que sumar o restar.

#define TR_GUARDAR_ESTADO 18
Terceto que indica que se debe guardar el estado del computador. No recibe
ningn operando.

#define TR_RESTAURAR_ESTADO 19
Terceto que indica que se debe restaurar el estado del computador. No recibe
ningn operando.

#define TR_VALOR_DEVUELTO 20
Terceto que indica que se debe usar el valor devuelto por el mtodo que termina.
No recibe ningn operando.

#define TR_INICIO_ARGUMENTOS 21
Terceto que indica el inicio de argumentos para la llamada a un mtodo.

#define TR_FIN_ARGUMENTOS 22
Terceto que indica el fin de argumentos para la llamada a un mtodo.

#define TR_ACTIVAR_REGISTRO_CLASE 23
Terceto que indica que se debe activar el registro de otra clase. Recibe dos
operandos numricos que indican la posicin del registro de activacin de la
clase de forma similar que TR_VALOR_VARIABLE.

#define TR_ACTIVAR_MISMA_CLASE 24
Terceto que indica que se debe seguir usando el registro de la clase actual.

#define TR_INICIO_IF 25
Terceto que indica el inicio de una sentencia condicional if-else. No recibe
ningn operando.

#define TR_FIN_IF 26
Terceto que indica el final de una sentencia condicional if-else. Recibe un
operando numrico que indica las etiquetas que se debe utilizar.

#define TR_ASIGNACION_INFORMATIVA 27
Terceto que indica el inicio de una asignacin

#define TR_COMP_IGUAL 28
Este terceto indica que se debe hacer una comparacin. Recibe dos operandos
numricos. El primero indica el tipo de comparacin que se debe realizar y el
segundo proporciona etiquetas.

#define TR_CUERPO_IF 29
Informa del comienzo del cuerpo if de una sentencia condicional if-else.
Recibe un operando numrico que proporciona etiquetas

Compiladores

31

Grupo 98

C# Compiler

#define TR_CUERPO_ELSE 30
Informa del comienzo del cuerpo else de una sentencia condicional if-else.
Recibe un operando numrico que proporciona etiquetas

#define TR_CONSOLE_READ 31
Terceto que implementa la lectura de un un entero por consola. No recibe ningn
operando.

#define TR_ASIGNACION_VECTOR 32
Terceto de asignacin en un vector. Recibe dos operandos numricos. El primero
indica si la variable donde se realiza la asignacin es del mtodo o de la clase, y
el segundo indica el desplazamiento correspondiente a la variable en el registro
de activacin correspondiente

#define TR_INICIO_VECTOR 33
Terceto que informa el inicio de una variable de tipo vector. No recibe ningn
operando.

#define TR_FIN_VECTOR 34
Terceto que informa del fin de una variable de tipo vector. No recibe ningn
operando.

#define TR_VALOR_VARIABLE_VECTOR 35
Terceto de acceso a una variable. Recibe dos operandos numricos. El primero
indica si la variable es del mtodo o de la clase, y el segundo indica el
desplazamiento

Para indicar el tipo de operando pasado al terceto se utilizan las siguientes definiciones
en el fichero types.h:

#define TR_NADA 0
Indica que no se pasa ningn valor til.

#define TR_NUMERO 1
Indica que se pasa un valor numrico.

#define TR_CADENA 2
Indica que se pasa un valor de cadena.

#define TR_REF 3
Indica que se pasa una referencia a otro terceto.

Compiladores

32

Grupo 98

C# Compiler

6.2 El mdulo Intermedio


Este mdulo proporciona las funciones necesarias para generar los tercetos a partir del
analizador sintctico. Todas las funciones que proporciona son llamadas desde el
analizador sintctico cuando ste tiene informacin til para la generacin de cdigo
intermedio.
Aunque el analizador sintctico y semntico estn preparados para soportar toda la
sintaxis del lenguaje C#, el generador de cdigo intermedio y objeto no implementan
todas las instrucciones del lenguaje. Es recomendable mirar el anexo para saber lo que
est y lo que no est implementado en el generador de cdigo. As mismo, un programa
que utilice alguna instruccin sintcticamente correcta que no est implementada por el
generador de cdigo desembocar en un cdigo objeto errneo o incompleto y no se
mostrar ningn error durante la compilacin.

Estructura de llamadas: Est estructura permite al mdulo intermedio guardar


mediante una pila las llamadas que se van realizando a los atributos o mtodos
de diferentes clases utilizando el operador ..
typedef struct llam_s llam_t;
struct llam_s {
char nomclase[250]; //utilizado por Intermedio_Informar_Llamada
char nomnombre[250]; //utilizado por Intermedio_Informar_Llamada
TS *tinformar; //utilizado por Intermedio_Informar_Llamada
llam_t *sig;
int tipo;
};

int Intermedio_Inicio(char fichero_salida[]);


Esta funcin recibe el nombre del fichero de salida donde se escribirn los
tercetos generados. Automticamente se aadir la extensin .ter al fichero
generado. Inicializa el generador de tercetos y el generador de cdigo
Intermedio.

terceto *Intermedio_Generar(int operacion,int t1,val v1,int t2, val v2);


Esta es la funcin ms utilizada. Sirve para generar un nuevo terceto. Recibe la
operacin del terceto a generar y los 2 tipos y valores de los operadores del
terceto. Desde esta funcin se llama al generador de cdigo objeto cada vez que
se genera un terceto.

int Intermedio_Fin();
Finaliza el generador de cdigo Intermedio.

int Intermedio_Etiqueta(int n);


Devuelve un nmero de etiqueta libre. En parmetro n indica el nmero de
etiquetas a reservar. Devuelve el valor de la primera etiqueta. Las siguientes
etiquetas reservadas son las consecutivas.

Compiladores

33

Grupo 98

C# Compiler

int Intermedio_Tamano_Registro(TS *tabla);


Esta funcin recibe una tabla de smbolos y calcula el tamao necesario que hay
que reservar para crear su registro de activacin.

int Intermedio_Informar_Clase_Main(TS *t);


A travs de sta funcin se informa al mdulo Intermedio de la tabla de
smbolos correspondiente al mtodo inicial Main.

int Intermedio_Posicion(TS *tabla,char *nombre);


Esta funcin recibe una tabla de smbolos y el nombre de un identificador y
calcula la posicin del identificador en el registro de activacin correspondiente.

int Intermedio_Write(int numero,char *cadena);


Funcin que implementa la generacin de los tercetos correspondientes a
Console.Write.

int Intermedio_Informar_Llamada(TS * t1, char *clas, char *nombr);


Esta funcin utiliza la estructura antes explicada para almacenar las llamadas
realizadas mediante el operador . de modo que si se realizan llamadas
recursivas utilizando . Queden almacenadas en la estructura.

int Intermedio_Informar_Llamada_Funcion();
Lo mismo que antes pero para llamadas a mtodos.

int Intermedio_Tipo_Llamada();
Devuelve el tipo de llamada en curso: Es decir llamada a atributo o a mtodo.

int Liberar_Informar_Llamada();
Como su nombre indica esta funcin libera una llamada de la pila de llamadas.

int Intermedio_Ultimo_TR();
Esta funcin devuelve el ltimo tipo de terceto generado.

int Intermedio_Salto(int devuelto);


Funcin que implementa la generacin de los tercetos correspondientes al salto a
un mtodo. El parmetro devuelto indica si se va a utilizar o no el valor
devuelto por el mtodo.

int Intermedio_Llamada(TS *t,char *nom);


Funcin que implementa la generacin de los tercetos correspondientes al salto a
un mtodo de otra clase utilizando el operador . Recibe la tabla de smbolos
actual y el nombre del identificador despus del ..

int Intermedio_Asignacion_Clase(TS *t,char *nom,int esvector);


Funcin que implementa la generacin de los tercetos correspondientes a la
asignacin a una variable de clase y no del mtodo actual.

Compiladores

34

Grupo 98

C# Compiler

int Intermedio_Valor_Variable_Clase(TS *t,char *nom,int esvector);


Funcin que implementa la generacin de los tercetos correspondientes al acceso
a una variable de clase y no del mtodo actual.
Para finalizar este punto, ponemos un ejemplo de la ejecucin del compilador y el
resultado del cdigo intermedio:
Lnea de comandos
C:\CSC\Debug> csc.exe t ..\pruebas\pruebaT.cs salida

pruebaT.cs
class clase{
public static void Main(){
short num1,num2;
num1=5;
num2=4;
if (num1>=num2) //falso
console.write("verdadero\n");
else
console.write("falso\n");
}
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_INMEDIATO

Compiladores

35

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 6
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 8
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 9
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 11
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 12
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 13
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 14
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 16
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 2

Compiladores

36

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 17
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 19
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 20
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 21
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 22
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 23
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 24
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

37

Grupo 98

C# Compiler

7 Generador de Cdigo Final


El generador de cdigo objeto traduce el cdigo intermedio generado por el generador
de cdigo intermedio en cdigo ensamblador para el winENS-2001. Cabe destacar que,
en nuestro caso, el cdigo objeto se genera al mismo tiempo que el cdigo intermedio,
es decir, todo el proceso de compilacin se realiza en una pasada. Cada terceto es
traducido por el mdulo objeto mediante una funcin asociada a cada terceto.
Aunque el analizador sintctico y semntico estn preparados para soportar toda la
sintaxis del lenguaje C#, el generador de cdigo intermedio y objeto no implementan
todas las instrucciones del lenguaje. Es recomendable mirar el anexo para saber lo que
est y lo que no est implementado en el generador de cdigo. As mismo, un programa
que utilice alguna instruccin sintcticamente correcta que no est implementada por el
generador de cdigo desembocar en un cdigo objeto errneo o incompleto y no se
mostrar ningn error durante la compilacin.
Excepto las dos funciones de inicializacin y finalizacin, todas las funciones de este
mdulo tienen el mismo nombre que el terceto que implementan precedido por el
prefijo Objeto_.
Pasamos a describir las funciones de este mtodo detalladamente:

Objeto_Inicializar(char fichero_salida[]);
Esta funcin inicializa el mdulo y recibe como parmetro el nombre del fichero
donde escribir el cdigo objeto en ensamblador. Automticamente se aadir la
extensin .ens al nombre del fichero.

Objeto_Finalizar();
Esta funcin finaliza el mdulo y cierra el fichero de salida.

Objeto_Inicio_Programa(){
fprintf(fdobjeto,"MOVE #INICIO_PILA,.SP\n");
fprintf(fdobjeto,"BR /SALTO\n");
}
Inicializa la pila y salta a salto donde comienza el programa.

Objeto_Fin_Programa(){
fprintf(fdobjeto,"\tPUSH #INICIO_PILA\n");
fprintf(fdobjeto,"\tCALL /E0\n");
fprintf(fdobjeto,"HALT\n");
fprintf(fdobjeto,"INICIO_PILA:\n");
}
Mete en la pila la direccin del registro de activacin de la clase del Main
pblico que corresponde con el inicio de la pila. Despus llama al Main que
siempre se encuentra en la etiqueta E0. Despus finaliza la ejecucin y marca el
comienzo de la pila.

Compiladores

38

Grupo 98

C# Compiler

Objeto_Metodo_Main() {
fprintf(fdobjeto,"E0:\n");
fprintf(fdobjeto,"\tMOVE .SP,.IY;metodo\n");
}
Marca el comienzo del mtodo Main y guarda el registro de pila en IY. El
registro IY se utilizara para acceder a las direcciones que marcan el registro de
activacin de la clase y el mtodo actual.

Objeto_Metodo(int n) {
fprintf(fdobjeto,"E%d: NOP ;metodo\n",n);
fprintf(fdobjeto,"\tMOVE .SP,.IY;metodo\n");
}
Marca el comienzo de un mtodo y guarda el registro de pila en IY. El registro
IY se utilizara para acceder a las direcciones que marcan el registro de activacin
de la clase y el mtodo actual. El parmetro n indica el nmero de etiqueta
correspondiente al mtodo.

Objeto_Metodo_Ret() {
fprintf(fdobjeto,"\tMOVE .IY,.SP\n");
fprintf(fdobjeto,"\tRET\n");
}
Restaura el valor de la pila y retorna del mtodo actual.

Objeto_Registro_Clase(int numero) {
fprintf(fdobjeto,"\t;Crear registro clase tamano %d\n",numero);
fprintf(fdobjeto,"\tMOVE .SP,.R0\n");
fprintf(fdobjeto,"\tADD #%d,.SP\n",numero);
fprintf(fdobjeto,"\tMOVE .A,.SP\n");
}
Crea en la pila el registro de activacin de una clase. El parmetro numero indica
el tamao del registro.

Objeto_Clase(int n) {
fprintf(fdobjeto,"E%d: NOP ;clase\n",n);
}
Pone la etiqueta del comienzo de una clase. El parmetro indica el nmero de
etiqueta.

Objeto_Salto() {
fprintf(fdobjeto,"SALTO:\n");
}
Marca el comienzo del programa principal, donde se crean los registros de
activacin iniciales y se llama al Main

Objeto_Registro_Metodo(int numero) {
fprintf(fdobjeto,"\t;Crear registro metodo tamano %d\n",numero);
fprintf(fdobjeto,"\tMOVE .SP,.R0\n");
fprintf(fdobjeto,"\tADD #%d,.SP\n",numero);

Compiladores

39

Grupo 98

C# Compiler

fprintf(fdobjeto,"\tMOVE .A,.SP\n");
fprintf(fdobjeto,"\tPUSH .R0\n");
}
Crea en la pila el registro de activacin de un mtodo. El parmetro numero
indica el tamao del registro. Al final mete en la pila el comienzo del registro.

Objeto_Asignacion(int n,int clase) {


if (clase==0)
clase=-3;
else
clase=-2;
fprintf(fdobjeto,"\t;asignacion pos %d\n",n);
fprintf(fdobjeto,"\tPOP .R0\n",n);//*
fprintf(fdobjeto,"\tMOVE #%d[.IY],.IX\n",clase);
fprintf(fdobjeto,"\tMOVE .R0,#%d[.IX]\n",n);
}
Hace una asignacin. El parmetro clase indica si la variable donde almacenar el
valor es del mtodo actual o de la clase actual y el parmetro n indica el
desplazamiento dentro del registro de activacin. Presupone que el valor esta
almacenado en la pila.

Objeto_Valor_Inmediato(int n)
{
fprintf(fdobjeto,"\t;valor inmediato %d\n",n);
fprintf(fdobjeto,"\tMOVE #%d,.R0\n",n);
fprintf(fdobjeto,"\tPUSH .R0\n",n);
}
Mete un valor inmediato en la pila. El parmetro n es el valor inmediato.

Objeto_Valor_Variable(int n,int clase) {


if (clase==0)
clase=-3;
else
clase=-2;
fprintf(fdobjeto,"\t;valor de variable\n");
fprintf(fdobjeto,"\tMOVE #%d[.IY],.IX\n",clase);
fprintf(fdobjeto,"\tMOVE #%d[.IX],.R0\n",n);
fprintf(fdobjeto,"\tPUSH .R0\n",n);
}
Mete un valor de variable en la pila. El parmetro clase indica si la variable es
del mtodo actual o de la clase actual y el parmetro n indica el desplazamiento
dentro del registro de activacin. Almacena el valor en la pila.

Objeto_Write_String(int n,char *s) {


fprintf(fdobjeto,"\t;cuerpo write string %s\n",s);
fprintf(fdobjeto,"\tWRSTR /E%d\n",n);
fprintf(fdobjeto,"\tBR /E%d\n",n+1);
fprintf(fdobjeto,"\tE%d: DATA \"%s\"\n",n,s);
fprintf(fdobjeto,"\tE%d: NOP ;fin cuerpo\n",n+1);
}

Compiladores

40

Grupo 98

C# Compiler

Escribe una cadena de caracteres. Recibe en n 2 nmeros de etiquetas para


utilizar y en s la cadena que se debe escribir en consola.

Objeto_Write_Short(int n) {
fprintf(fdobjeto,"\tWRINT #%c[.IY] ;write short\n",n);
}
Escribe un Short. Recibe en n el nmero que se debe escribir en consola.

Objeto_Salto_Metodo(int n) {
fprintf(fdobjeto,"\t;Salto a metodo misma clase etiqueta E%d\n",n);
fprintf(fdobjeto,"\tCALL /E%d\n",n);
fprintf(fdobjeto,"\tDEC .SP\n");
fprintf(fdobjeto,"\tPOP .SP\n");
}
Salta a un mtodo de la clase actual. Da por hecho que los registros de
activacin ya estn correctos. Despus de la llamada restaura el registro de
activacin anterior guardado en la pila.

Objeto_Inicio_Write_String() {
fprintf(fdobjeto,"\tMOVE .SP,.R2 ;incio write string\n");}
Guarda SP en R2 porque a partir de ahora se metern en la pila los valores que
hay que escribir en una cadena. R2 marcar la direccin del primer argumento a
escribir.

Objeto_Fin_Write_String() {
fprintf(fdobjeto,"\tMOVE .R2,.SP ;fin write string\n");
}
Saca de la pila todos los elementos que se han escrito.

Objeto_Suma(int n) {
fprintf(fdobjeto,"\tPOP .R0 ;operacion aritmetica\n");
fprintf(fdobjeto,"\tPOP .R3\n");
if (n==1) fprintf(fdobjeto,"\tADD .R3,.R0 ;suma\n");
else if (n==2) fprintf(fdobjeto,"\tSUB .R3,.R0 ;resta\n");
fprintf(fdobjeto,"\tMOVE .A,.R0\n");
fprintf(fdobjeto,"\tPUSH .R0\n",n);
}
Realiza la operacin suma (si n=1) o resta (si n=2). Presupone que los valores a
sumar estn en la pila.

Objeto_Guardar_Estado() {
fprintf(fdobjeto,"\t;guardar estado\n");
fprintf(fdobjeto,"\tPUSH .SP\n");
fprintf(fdobjeto,"\tPUSH .SR\n");
fprintf(fdobjeto,"\tPUSH .IX\n");
fprintf(fdobjeto,"\tPUSH .IY\n");
fprintf(fdobjeto,"\tPUSH .A\n");
//
fprintf(fdobjeto,"\tPUSH .R0\n"); //aqui va el valor devuelto
fprintf(fdobjeto,"\tPUSH .R1\n");

Compiladores

41

Grupo 98

C# Compiler

fprintf(fdobjeto,"\tPUSH .R2\n");
fprintf(fdobjeto,"\tPUSH .R3\n");
fprintf(fdobjeto,"\tPUSH .R4\n");
fprintf(fdobjeto,"\tPUSH .R5\n");
fprintf(fdobjeto,"\tPUSH .R6\n");
fprintf(fdobjeto,"\tPUSH .R7\n");
fprintf(fdobjeto,"\tPUSH .R8\n");
fprintf(fdobjeto,"\tPUSH .R9\n");
fprintf(fdobjeto,"\t;fin de guardar estado\n");
}
Guarda el estado de los registros del procesador. No guarda R0 porque aqu va el
valor devuelto del mtodo en caso de que devuelva algn valor.

Objeto_Restaurar_Estado() {
fprintf(fdobjeto,"\t;restaurar estado\n");
fprintf(fdobjeto,"\tPOP .R9\n");
fprintf(fdobjeto,"\tPOP .R8\n");
fprintf(fdobjeto,"\tPOP .R7\n");
fprintf(fdobjeto,"\tPOP .R6\n");
fprintf(fdobjeto,"\tPOP .R5\n");
fprintf(fdobjeto,"\tPOP .R4\n");
fprintf(fdobjeto,"\tPOP .R3\n");
fprintf(fdobjeto,"\tPOP .R2\n");
fprintf(fdobjeto,"\tPOP .R1\n");
//
fprintf(fdobjeto,"\tPOP .R0\n"); //aqui va el valor devuelto
fprintf(fdobjeto,"\tPOP .A\n");
fprintf(fdobjeto,"\tPOP .IY\n");
fprintf(fdobjeto,"\tPOP .IX\n");
fprintf(fdobjeto,"\tPOP .SR\n");
fprintf(fdobjeto,"\tPOP .SP\n");
fprintf(fdobjeto,"\t;fin de restaurar estado\n");
}
Restaura el estado de los registros del procesador. No restaura R0 porque aqu va
el valor devuelto del mtodo en caso de que devuelva algn valor.

Objeto_Valor_Devuelto() {
fprintf(fdobjeto,"\t;valor devuelto\n");
fprintf(fdobjeto,"\tPUSH .R0\n");
}
Guarda el valor devuelto por un mtodo en la pila.

Objeto_Inicio_Argumentos() {
fprintf(fdobjeto,"\tMOVE .SP,.R2 ;incio argumentos\n");
}
Guarda SP en R2 porque a partir de ahora se metern en la pila los valores de los
parmetros que se pasarn a un mtodo.

Objeto_Fin_Argumentos() {
fprintf(fdobjeto,"\tMOVE .R2,.SP ;fin argumentos\n");
}

Compiladores

42

Grupo 98

C# Compiler

Saca de la pila los valores de los argumentos porque ya no son necesarios.

Objeto_Activar_Registro_Clase(int n,int clase) {


if (clase==0)
clase=-3;
else
clase=-2;
fprintf(fdobjeto,"\t;activar registro clase\n");
fprintf(fdobjeto,"\tMOVE #%d[.IY],.R0\n",clase);
fprintf(fdobjeto,"\tADD #%d,.R0\n",n);
fprintf(fdobjeto,"\tPUSH .A\n",n);
}
Mete un la pila la direccin del registro de activacin de una clase. El parmetro
clase indica si el registro est en el mtodo actual o en la clase actual y el
parmetro n indica el desplazamiento dentro del registro de activacin actual.
Almacena el valor en la pila.

Objeto_Activar_Misma_Clase() {
fprintf(fdobjeto,"\t;activar registro misma clase\n");
fprintf(fdobjeto,"\tMOVE #-2[.IY],.R0\n");
fprintf(fdobjeto,"\tPUSH .R0\n");
}
Mete en la pila la direccin del registro de activacin de la clase actual.

Objeto_Inicio_If() {
fprintf(fdobjeto,"\tMOVE #0,.R3 ;inicio if\n");
}
Mete en R3 un 0. Esto es porque se inicia una comparacin lgica. Si alguna
comparacin resulta falsa, pondr un uno en R3.

Objeto_Fin_If(int eti) {
fprintf(fdobjeto,"\tE%d: NOP; fin if\n",eti+1);
}
Pone la etiqueta del final del if.

Objeto_Asignacion_Informativa() {
fprintf(fdobjeto,"\t;asignacion informativa\n");
}
Indica el inicio de una asignacin. Este terceto no necesita ninguna
implementacin en nuestro generador de cdigo objeto. Sin embargo, hacemos
esta funcin y ponemos un comentario para dar ms claridad al cdigo del
compilador y al cdigo generado.

Objeto_Comp_Igual(int op,int eti) {


fprintf(fdobjeto,"\t;comp igual op %d eti %d\n",op,eti);
fprintf(fdobjeto,"\tPOP .R1\n");
fprintf(fdobjeto,"\tPOP .R0\n");
fprintf(fdobjeto,"\tCMP .R0,.R1\n");

Compiladores

43

Grupo 98

C# Compiler

if (op==1) //igual
fprintf(fdobjeto,"\tBZ /E%d\n",eti);
else if (op==2) //distinto
fprintf(fdobjeto,"\tBNZ /E%d\n",eti);
else if (op==3) {//mayor
fprintf(fdobjeto,"\tBZ /E%d\n",eti+1); //son iguales
fprintf(fdobjeto,"\tBP /E%d\n",eti);
}
else if (op==4) //menor
fprintf(fdobjeto,"\tBN /E%d\n",eti);
else if (op==5) //mayor igual
fprintf(fdobjeto,"\tBP /E%d\n",eti);
else if (op==6) {//menor igual
fprintf(fdobjeto,"\tBN /E%d\n",eti);
fprintf(fdobjeto,"\tBZ /E%d\n",eti);
}
fprintf(fdobjeto,"\tBR /E%d\n",eti+1);
fprintf(fdobjeto,"\tE%d: MOVE #1,.R3; \n",eti);
fprintf(fdobjeto,"\tE%d: NOP; fin comp igual\n",eti+1);
}
Realiza la comparacin. El tipo de comparacin lo indica el parmetro op. Si el
resultado de la comparacin es falso pone el valor un en R3

Objeto_Cuerpo_If(int eti) {
fprintf(fdobjeto,"\t;cuerpo if\n");
fprintf(fdobjeto,"\tCMP #0,.R3\n");
fprintf(fdobjeto,"\tBZ /E%d\n",eti);
}
Comprueba si el resultado de las comparaciones lgicas es verdadero (R0=0) y
si no es as salta al else.

Objeto_Cuerpo_Else(int eti) {
fprintf(fdobjeto,"\t;cuerpo else %d\n",eti);
fprintf(fdobjeto,"\tBR /E%d\n",eti+1);
fprintf(fdobjeto,"\tE%d: NOP\n",eti);
}
Salta al final del if y pone la etiqueta del comienzo del bloque else

Objeto_Console_Read() {
fprintf(fdobjeto,"\t;console read\n");
fprintf(fdobjeto,"\tININT .R0\n");
fprintf(fdobjeto,"\tPUSH .R0\n");
}
Lee de la consola un entero y lo mete en la pila.

Objeto_Asignacion_Vector(int n,int clase) {


if (clase==0)
clase=-3;
else
clase=-2;

Compiladores

44

Grupo 98

C# Compiler

fprintf(fdobjeto,"\t;asignacion vector pos %d\n",n);


fprintf(fdobjeto,"\tPOP .R0\n",n);
fprintf(fdobjeto,"\tMOVE #%d[.IY],.IX\n",clase);
fprintf(fdobjeto,"\tPOP .A\n");
fprintf(fdobjeto,"\tADD #%d,.A\n",n);
fprintf(fdobjeto,"\tADD .IX,.A\n");
fprintf(fdobjeto,"\tMOVE .R0,[.A]\n");
}
Hace una asignacin en un vector. El parmetro clase indica si la variable donde
almacenar el valor es del mtodo actual o de la clase actual y el parmetro n
indica el desplazamiento dentro del registro de activacin. Presupone que en la
pila esta el desplazamiento del vector y el valor a asignar.

Objeto_Inicio_Vector() {
fprintf(fdobjeto,"\t;inicio vector\n");
}
Indica el inicio de un vector. Este terceto no necesita ninguna implementacin en
nuestro generador de cdigo objeto. Sin embargo, hacemos esta funcin y
ponemos un comentario para dar ms claridad al cdigo del compilador y al
cdigo generado.

Objeto_Fin_Vector() {
fprintf(fdobjeto,"\t;Fin vector\n");
}
Indica el final de un vector. Este terceto no necesita ninguna implementacin en
nuestro generador de cdigo objeto. Sin embargo, hacemos esta funcin y
ponemos un comentario para dar ms claridad al cdigo del compilador y al
cdigo generado.

Objeto_Valor_Variable_Vector(int n,int clase) {


if (clase==0)
clase=-3;
else
clase=-2;
fprintf(fdobjeto,"\t;valor de variable vector\n");
fprintf(fdobjeto,"\tMOVE #%d[.IY],.IX\n",clase);
fprintf(fdobjeto,"\tPOP .A\n");
fprintf(fdobjeto,"\tADD #%d,.A\n",n);
fprintf(fdobjeto,"\tADD .IX,.A\n");
fprintf(fdobjeto,"\tMOVE [.A],.R0\n",n);
fprintf(fdobjeto,"\tPUSH .R0\n",n);
}
Mete un valor de variable de un vector en la pila. El parmetro clase indica si la
variable es del mtodo actual o de la clase actual y el parmetro n indica el
desplazamiento dentro del registro de activacin. Almacena el valor en la pila.
Presupone que en la pila est el desplazamiento a utilizar en el vector.

Compiladores

45

Grupo 98

Compiladores

C# Compiler

46

Grupo 98

C# Compiler

8 Generador de Errores
El mdulo del generador de errores se encarga de almacenar los errores producidos en la
compilacin de un fichero, junto con los datos importantes de cada error, para que al
finalizar el programa se visualicen todos los errores obtenidos. La estructura de un
mensaje de error es el siguiente:
"fichero", Line X: Tipo Error: #id_error: mensaje_error

Primeramente indicamos el nombre del fichero que estamos compilando. A


continuacin la linea donde se ha producido el error. Seguidamente el tipo de error que
se ha producido.
Los errores que pueden aparecer en la compilacin pueden ser lxicos, sintcticos o
semnticos. De ah que el generador de errores los divida de esta forma: Lexer,
Sintactic, Semantic.
Por ultimo, aparece el cdigo del error (para posteriormente consultarlo a un posible
manual de explicacin de errores) y el respectivo mensaje de error.
Para utilizar el modulo del gestor de errores, se nos facilita la siguiente interfaz de
usuario:

int Cuenta_Param(char * linea);

Esta funcin devuelve el nmero de ocurrencias de %s en el parmetro lnea. Es


mediante %s como indicamos la posicin de los parmetros optativos en el
mensaje de error del compilador.

int Almacenar_Error(int cod, int linea, ...);

Esta funcin se utiliza para almacenar un error producido en la compilacin de


un fichero. Se indica el cdigo del error producido, la lnea del fichero donde se
ha producido dicho error, y sus posibles argumentos, dependiendo del tipo de
error. Por ejemplo, para indicar que una clase esta declarada dos veces,
necesitamos el nombre de esa clase para generar el error.

void Imprimir_Sumario();

Imprime todo el conjunto de errores almacenados en la compilacin del fichero.


Los errores los imprime por Standard Error y uno debajo de otro.

char * Devuelve_Error(int cod);

Funcin que dado un cdigo de error devuelve su mensaje de error asociado, en


el formato utilizado por el programa y sin hacer ningn tratamiento de los
parmetros optativos.

char * Inserta_Parametro(char * cadena, char * param);

Mediante esta funcin sustituiremos cada una de las ocurrencias de %s en el


mensaje de error por su valor. El mensaje de error se nos pasar en cadena. El
nuevo valor de la cadena retorna de la funcin. Se debe llamar tantas veces como
parmetros optativos tenga el mensaje de error.

Compiladores

47

Grupo 98

C# Compiler

Los errores que puede generar el gestor de errores son los siguientes:

Lxicos:
o Token not valid
o not end of Comment
o not valid
o ID not valid

Sintacticos:
o "class expected",
o "token '{' expected",
o "token '}' expected",
o "token 'ID' expected",
o "token ';' expected",
o "token '[' expected",
o "token ']' expected",
o "'SentAsig' not valid",
o "'SentMet' not valid",
o "'Sentencia' not valid",
o "token '(' expected",
o "token ')' expected",
o "token 'ID' or 'Tipo' expected",
o "token 'Constant Integer' expected",
o "'Primario' not valid",
o "'Declaracion' not valid",
o "'DeclAtributo' not valid",
o "expected predefined type",
o "token 'OL' expected",
o "predefined type necessary"

Semnticos:
o "not a main method in file",
o "class %s already exists",
o "not exists %s lemma",
o "types not equal in Sentencia",
o "predefined type in list",
o "type var not class",
o "expressions must be the same type"
o "not exists that method", /* the method %s not exists" */
o "types not equal in return",
o "token %s already exists",
o "not exists %s class",
o "method %s is private",
o "not exist %s atribute in class %s",
o "atribute %s is not a list",
o "not integer value in expression",
o "innecesary '{ }' tokens for sentencias in %s",

Compiladores

48

Grupo 98

C# Compiler

o
o
o
o
o
o
o
o
o
o
o
o
o
o

Compiladores

param %d of method %s does not have that type",


"differents types of list",
"value is not in atribute",
"expresion must be bool type",
"not bool o short type",
"bool type without correct OL",
"Terminos with differents types OR not SHORT",
"Factor with differents OR not SHORT",
"Primario not BOOL",
"Declaracion not valid with class",
"more than one main method not valid"
"not return val in method",
"types of asignation not equal"
"Var not inicializated"

49

Grupo 98

C# Compiler

9 Programa Principal
El programa principal se llama CSC (C Sharp Compiler). Este programa posee las
siguientes opciones:
GNU C Sharp Compiler
Usage: csc [options] <source_file> <output_file>
Options:
-h, --help
display this help
-s, --sin
display sintactic debug
-t, --ter
create intermiddle code
-o, --obj
create object object
Press any key to continue

De esta forma, se nos facilita la posibilidad de realizar un anlisis sintctico nicamente,


o bien solo el paso a cdigo intermedio, o bien solo el paso a cdigo objeto, o bien
todos los pasos. Tanto el cdigo intermedio como el cdigo final se escribe en dos
ficheros cuyo nombre es el indicado como argumento output_file y con extensin
diferente:
Output File
Cdigo Intermedio
Cdigo Final

Salida
Salida.ter
Salida.ens

El programa principal se comunica con el analizador lexico mediante la funcin


read_token() el cual va leyendo token a token y lo va devolviendo en una estructura
de tipo TToken, el cual contiene toda la informacin necesaria para el uso de dicho
token.
El programa principal se comunica con el analizador sintctico y semntico (ambos
cdigos juntos) mediante la funcin sintactico(). Y estos a su vez se comunican con
los generadores de cdigo intermedio y final mediante las funcione vistas en los
apartados anteriores.
Por ultimo, el programa principal, junto con el resto de analizadores y generadores, se
comunican con el gestor de errores y la tabla de smbolos utilizando la interfaz de
usuario explicada en anteriores apartados.

Compiladores

50

Grupo 98

C# Compiler

10 Pruebas
En todas las pruebas ejecutamos el compilador con la siguiente lnea de comando:
Lnea de comandos
C:\CSC\Debug> csc.exe o ..\pruebas\pruebaX.cs salida

Y el resultado obtenido, a excepcin de errores de compilacin (que los mostraremos en


cada prueba que genere error), es el siguiente:
Lnea de comandos
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\pruebaX.cs
Fichero Salida: salida
Compilando...
Compilacion finalizada correctamente.

10.1 Prueba 1
prueba101.cs
class clase{
short numero3;
void metodo1() {
console.write("Estoy en el metodo1\n");
}
public static void Main(){
short numero1;
short numero2;
metodo1();
console.write("hola\n");
numero1=4;
numero2=5-2+3-7; //=-1
numero3=6;
numero1=numero3;
numero1=numero2+5-1; //=3
numero3=2-numero3-numero2+numero1+5; //=2-6-(-1)+3+5=5
console.write("n1: {0}\nn2: {1}\nn3: {2}\n", numero1, numero2,
numero3);
console.write("adios\n");
}

Compiladores

51

Grupo 98

C# Compiler

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 5
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 8
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 9
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 11

Compiladores

52

Grupo 98

C# Compiler

Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 13
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 14
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 16
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 19
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 20
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 21
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 22
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 23
Operacion: TR_VALOR_INMEDIATO

Compiladores

53

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 24
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 25
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 26
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 28
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 29
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 30
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 31
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 32
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 33
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 34
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 35
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1

Compiladores

54

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 36
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 37
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 38
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 39
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 40
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 41
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 42
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 43
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 44
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 45
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 46
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 47
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5

Compiladores

55

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 48
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 49
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 50
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 51
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 52
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 53
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 54
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 55
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 56
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 57
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 58
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 59
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 50
Tipo: TR_NUMERO
Valor: 50
------------------------------------------------

Compiladores

56

Grupo 98

C# Compiler

Direccion: 60
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 13
Tipo: TR_NUMERO
Valor: 13
-----------------------------------------------Direccion: 61
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 62
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 63
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
-----------------------------------------------Direccion: 64
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 65
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 66
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 67
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 68
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Estoy en el metodo1\n
WRSTR /E3
BR /E4
E3: DATA "Estoy en el metodo1\n"
E4: NOP ;fin cuerpo

Compiladores

57

Grupo 98

C# Compiler

MOVE .IY,.SP
RET
E0:

MOVE .SP,.IY;metodo
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .SP,.R2 ;incio write string
;cuerpo write string hola\n
WRSTR /E5
BR /E6
E5: DATA "hola\n"
E6: NOP ;fin cuerpo
;asignacion informativa
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX

Compiladores

58

Grupo 98

C# Compiler

MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;valor inmediato 7
MOVE #7,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#1[.IX]
;asignacion informativa
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma

Compiladores

59

Grupo 98

C# Compiler

MOVE .A,.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0

Compiladores

60

Grupo 98

C# Compiler

PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string n1:
WRSTR /E7
BR /E8
E7: DATA "n1: "
E8: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \nn2:
WRSTR /E9
BR /E10
E9: DATA "\nn2: "
E10: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \nn3:
WRSTR /E11
BR /E12
E11: DATA "\nn3: "
E12: NOP ;fin cuerpo
WRINT #2[.IY] ;write short
;cuerpo write string \n
WRSTR /E13
BR /E14
E13: DATA "\n"
E14: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .SP,.R2 ;incio write string
;cuerpo write string adios\n
WRSTR /E15
BR /E16
E15: DATA "adios\n"
E16: NOP ;fin cuerpo
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Compiladores

61

Grupo 98

C# Compiler

Ejecucin
Estoy en el metodo1
hola
n1: 3
n2: -1
n3: 5
adios

10.2 Prueba 2
prueba102.cs
class clase{
short numero3;
public static void Main(){
short numero1;
short numero2;
console.write("hola\n");
numero1=4; //n1=4
numero2=3; //n2=3
numero1+=3+1; //n1=8
numero1-=5-numero2; // =n1=8-2=6
console.write("n1: {0}\n",numero1);
console.write("adios\n");
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

62

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 4
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 7
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 8
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 9
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 10
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 11
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 12
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 14
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 15
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
------------------------------------------------

Compiladores

63

Grupo 98

C# Compiler

Direccion: 16
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 18
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 19
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 20
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 21
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 22
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 23
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 24
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 25
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 26
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 27
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 28

Compiladores

64

Grupo 98

C# Compiler

Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 29
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 30
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 31
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 32
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 33
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 34
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 35
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E0:
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string hola\n
WRSTR /E2
BR /E3
E2: DATA "hola\n"
E3: NOP ;fin cuerpo
;asignacion informativa
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 0

Compiladores

65

Grupo 98

C# Compiler

POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#1[.IX]
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string

Compiladores

66

Grupo 98

C# Compiler

;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string n1:
WRSTR /E4
BR /E5
E4: DATA "n1: "
E5: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E6
BR /E7
E6: DATA "\n"
E7: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .SP,.R2 ;incio write string
;cuerpo write string adios\n
WRSTR /E8
BR /E9
E8: DATA "adios\n"
E9: NOP ;fin cuerpo
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
hola
n1: 6
adios

10.3 Prueba 3
prueba103.cs
class clase{
short numero3;

Compiladores

67

Grupo 98

C# Compiler

void metodo1() {
console.write("Estoy en el metodo1\n");
}
void metodo2() {
console.write("Estoy en el metodo2\n");
}
public static void Main(){
short n1;
n1=5;
metodo1();
n1+=3;
console.write("Estoy en Main {0}\n",n1);
metodo2();
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 5
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 7

Compiladores

68

Grupo 98

C# Compiler

Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 8
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 9
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 11
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 13
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 14
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 16
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 17
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 18
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 19
Operacion: TR_VALOR_VARIABLE

Compiladores

69

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 20
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 21
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 22
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 23
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 24
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 25
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 26
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 27
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 28
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 29
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 30
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 31
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA

Compiladores

70

Grupo 98

C# Compiler

Tipo: TR_NADA
-----------------------------------------------Direccion: 32
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 33
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 34
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 35
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 36
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 37
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 38
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Estoy en el metodo1\n
WRSTR /E3
BR /E4
E3: DATA "Estoy en el metodo1\n"
E4: NOP ;fin cuerpo
MOVE .IY,.SP
RET
E5: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Estoy en el metodo2\n
WRSTR /E6
BR /E7

Compiladores

71

Grupo 98

C# Compiler

E6: DATA "Estoy en el metodo2\n"


E7: NOP ;fin cuerpo
MOVE .IY,.SP
RET
E0:

MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0

Compiladores

72

Grupo 98

C# Compiler

PUSH .R0
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Main
WRSTR /E8
BR /E9
E8: DATA "Estoy en Main "
E9: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E10
BR /E11
E10: DATA "\n"
E11: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E5
CALL /E5
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8

Compiladores

73

Grupo 98

C# Compiler

POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Estoy en el metodo1
Estoy en Main 8
Estoy en el metodo2

10.4 Prueba 4
prueba104.cs
class clase{
short numero3;
short metodo1() {
console.write("Estoy en el metodo1\n");
numero3=10;
return 5+numero3;
}
public static void Main(){
short n1;
n1=metodo1();

Compiladores

74

Grupo 98

C# Compiler

console.write("Estoy en Main {0}\n",n1);


n1=3+metodo1()+1;
console.write("Sigo en Main {0}\n",n1);
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 7
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 8
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 9
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0

Compiladores

75

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 10
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 11
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 13
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 14
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 16
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 19
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 20
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 21
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0

Compiladores

76

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 22
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 23
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 24
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 25
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 26
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 27
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 29
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 30
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 31
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 32
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 33
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
------------------------------------------------

Compiladores

77

Grupo 98

C# Compiler

Direccion: 34
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 35
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 36
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 37
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 38
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 39
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 40
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 41
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 42
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 43
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 44
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 45
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 46

Compiladores

78

Grupo 98

C# Compiler

Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 47
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 48
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 49
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 50
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Estoy en el metodo1\n
WRSTR /E3
BR /E4
E3: DATA "Estoy en el metodo1\n"
E4: NOP ;fin cuerpo
;asignacion informativa
;valor inmediato 10
MOVE #10,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP

Compiladores

79

Grupo 98

E0:

C# Compiler

RET
MOVE .IY,.SP
RET
MOVE .SP,.IY;metodo
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0

Compiladores

80

Grupo 98

C# Compiler

;cuerpo write string Estoy en Main


WRSTR /E5
BR /E6
E5: DATA "Estoy en Main "
E6: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E7
BR /E8
E7: DATA "\n"
E8: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto

Compiladores

81

Grupo 98

C# Compiler

PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Sigo en Main
WRSTR /E9
BR /E10
E9: DATA "Sigo en Main "
E10: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E11
BR /E12
E11: DATA "\n"
E12: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Estoy en el metodo1
Estoy en Main 15
Estoy en el metodo1
Sigo en Main 19

Compiladores

82

Grupo 98

C# Compiler

10.5 Prueba 5
prueba105.cs
class clase{
short num;
short metodo1(short n1,short n2) {
console.write("Metodo1: n1={0}, n2={1}\n",n1,n2);
console.write("Metodo1: n1+n2={0}\n",n1+n2);
return n1+n2;
}
public static void Main(){
num=1;
console.write("Estoy en Main\n");
console.write("Resultado de metodo1: {0}\n",metodo1(5,6));
metodo1(5+num,6);
}
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 5
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 6
Operacion: TR_WRITE_STRING

Compiladores

83

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 7
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 8
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 9
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 10
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 11
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 14
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 15
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 16
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 17
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 18
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11

Compiladores

84

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 19
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 20
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 21
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 22
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 23
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 24
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 25
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 26
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 28
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 29
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 30
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 13
Tipo: TR_NUMERO
Valor: 13

Compiladores

85

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 31
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 32
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 33
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 34
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 35
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 36
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 37
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 38
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 39
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 40
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 41
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 42
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
------------------------------------------------

Compiladores

86

Grupo 98

C# Compiler

Direccion: 43
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 44
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 17
Tipo: TR_NUMERO
Valor: 17
-----------------------------------------------Direccion: 45
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 46
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 47
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 48
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 49
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 50
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 51
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 52
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 53
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 54
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 55

Compiladores

87

Grupo 98

C# Compiler

Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 56
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 57
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 58
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 59
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 60
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 61
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;cuerpo write string Metodo1: n1=
WRSTR /E3
BR /E4
E3: DATA "Metodo1: n1="
E4: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string , n2=
WRSTR /E5

Compiladores

88

Grupo 98

E0:

C# Compiler

BR /E6
E5: DATA ", n2="
E6: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E7
BR /E8
E7: DATA "\n"
E8: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;cuerpo write string Metodo1: n1+n2=
WRSTR /E9
BR /E10
E9: DATA "Metodo1: n1+n2="
E10: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E11
BR /E12
E11: DATA "\n"
E12: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;asignacion pos 0
POP .R0

Compiladores

89

Grupo 98

C# Compiler

MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;cuerpo write string Estoy en Main\n
WRSTR /E13
BR /E14
E13: DATA "Estoy en Main\n"
E14: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado

Compiladores

90

Grupo 98

C# Compiler

;valor devuelto
PUSH .R0
;cuerpo write string Resultado de metodo1:
WRSTR /E15
BR /E16
E15: DATA "Resultado de metodo1: "
E16: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E17
BR /E18
E17: DATA "\n"
E18: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9

Compiladores

91

Grupo 98

C# Compiler

POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Estoy en Main
Metodo1: n1=5, n2=6
Metodo1: n1+n2=11
Resultado de metodo1: 11
Metodo1: n1=6, n2=6
Metodo1: n1+n2=12

10.6 Prueba 6
prueba106.cs
class prueba {
short var1,var2;
public void metodo1() {
short p;
var2=3;
p=4;
console.write("Estoy en el Metodo1 {0},{1}\n",var2,p);

Compiladores

92

Grupo 98

C# Compiler

class clase{
short num1;
prueba p1;
void metodo2() {
short p;
num1=5;
p=6;
console.write("Estoy en el Metodo2 {0},{1}\n",num1,p);
}
public static void Main(){
short num2;

num1=1;
num2=2;
console.write("Empiezo en Main {0},{1}\n",num1,num2);
p1.metodo1();
console.write("Sigo en Main {0},{1}\n",num1,num2);
metodo2();
console.write("Termino en Main {0},{1}\n",num1,num2);

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION

Compiladores

93

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 6
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 8
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 9
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 11
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 12
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 13
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 14
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 15
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 16
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 17
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA

Compiladores

94

Grupo 98

C# Compiler

Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 19
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 20
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 21
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 22
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 23
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 24
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 25
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 26
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 27
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 29
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0

Compiladores

95

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 30
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 31
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 32
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 13
Tipo: TR_NUMERO
Valor: 13
-----------------------------------------------Direccion: 33
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 34
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
-----------------------------------------------Direccion: 35
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 36
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 37
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 38
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 39
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 40
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 41
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

96

Grupo 98

C# Compiler

Direccion: 42
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 43
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 44
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 45
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 46
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 47
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 17
Tipo: TR_NUMERO
Valor: 17
-----------------------------------------------Direccion: 48
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 49
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 19
Tipo: TR_NUMERO
Valor: 19
-----------------------------------------------Direccion: 50
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 51
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 21
Tipo: TR_NUMERO
Valor: 21
-----------------------------------------------Direccion: 52
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 53
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 54

Compiladores

97

Grupo 98

C# Compiler

Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 55
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 56
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 57
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 58
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 59
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 60
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 61
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 23
Tipo: TR_NUMERO
Valor: 23
-----------------------------------------------Direccion: 62
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 63
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 25
Tipo: TR_NUMERO
Valor: 25
-----------------------------------------------Direccion: 64
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 65
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 27
Tipo: TR_NUMERO
Valor: 27
-----------------------------------------------Direccion: 66
Operacion: TR_FIN_WRITE_STRING

Compiladores

98

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 67
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 68
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 69
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 70
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 71
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 72
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 73
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 74
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 75
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 29
Tipo: TR_NUMERO
Valor: 29
-----------------------------------------------Direccion: 76
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 77
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 31
Tipo: TR_NUMERO
Valor: 31
-----------------------------------------------Direccion: 78
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49

Compiladores

99

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 79
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 33
Tipo: TR_NUMERO
Valor: 33
-----------------------------------------------Direccion: 80
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 81
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 82
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 83
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 84
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 85
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#1[.IX]
;asignacion informativa
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 0
POP .R0

Compiladores

100

Grupo 98

C# Compiler

MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en el Metodo1
WRSTR /E3
BR /E4
E3: DATA "Estoy en el Metodo1 "
E4: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E5
BR /E6
E5: DATA ","
E6: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E7
BR /E8
E7: DATA "\n"
E8: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
E9: NOP ;clase
E10: NOP ;metodo
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en el Metodo2
WRSTR /E11

Compiladores

101

Grupo 98

C# Compiler

BR /E12
E11: DATA "Estoy en el Metodo2 "
E12: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E13
BR /E14
E13: DATA ","
E14: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E15
BR /E16
E15: DATA "\n"
E16: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
E0:

MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Empiezo en Main
WRSTR /E17
BR /E18
E17: DATA "Empiezo en Main "
E18: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E19
BR /E20
E19: DATA ","
E20: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E21
BR /E22
E21: DATA "\n"

Compiladores

102

Grupo 98

C# Compiler

E22: NOP ;fin cuerpo


MOVE .R2,.SP ;fin write string
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #1,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Sigo en Main
WRSTR /E23
BR /E24
E23: DATA "Sigo en Main "
E24: NOP ;fin cuerpo

Compiladores

103

Grupo 98

C# Compiler

WRINT #0[.IY] ;write short


;cuerpo write string ,
WRSTR /E25
BR /E26
E25: DATA ","
E26: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E27
BR /E28
E27: DATA "\n"
E28: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E10
CALL /E10
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0

Compiladores

104

Grupo 98

C# Compiler

PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Termino en Main
WRSTR /E29
BR /E30
E29: DATA "Termino en Main "
E30: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E31
BR /E32
E31: DATA ","
E32: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E33
BR /E34
E33: DATA "\n"
E34: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 3
MOVE .SP,.R0
ADD #3,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Empiezo en Main 1,2
Estoy en el Metodo1 3,4
Sigo en Main 1,2
Estoy en el Metodo2 5,6
Termino en Main 5,2

10.7 Prueba 7
prueba107.cs
class prueba {
short var1,var2;

Compiladores

105

Grupo 98

C# Compiler

public short metodo1() {


short p;
var2=3;
p=4;
console.write("Estoy en el Metodo1 {0},{1}\n",var2,p); //3,4
return var2+p; // 7
}
}
class clase{
short num1;
prueba p1;
short metodo2() {
short p;
num1=5;
p=6;
console.write("Estoy en el Metodo2 {0},{1}\n",num1,p); //5,6
return num1+p; // 11
}
public static void Main(){
short num2;

num1=1;
num2=2;
console.write("Empiezo en Main {0},{1}\n",num1,num2); // 1,2
num2=p1.metodo1();
console.write("Sigo en Main {0},{1}\n",num1,num2); // 1,7
num2=metodo2();
console.write("Termino en Main {0},{1}\n",num1,num2); //5,11

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

106

Grupo 98

C# Compiler

Direccion: 4
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 6
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 8
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 9
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 11
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 12
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 13
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 14
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 15
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 16

Compiladores

107

Grupo 98

C# Compiler

Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 17
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 19
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 20
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 21
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 22
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 23
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 24
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 25
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 26
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 27
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 28
Operacion: TR_ASIGNACION_INFORMATIVA

Compiladores

108

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 29
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 30
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 31
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 32
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 33
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 34
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 35
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 36
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 13
Tipo: TR_NUMERO
Valor: 13
-----------------------------------------------Direccion: 37
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 38
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
-----------------------------------------------Direccion: 39
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 40
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0

Compiladores

109

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 41
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 42
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 43
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 44
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 45
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 46
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 47
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 48
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 49
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 50
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 51
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 52
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

110

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 53
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 54
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 55
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 17
Tipo: TR_NUMERO
Valor: 17
-----------------------------------------------Direccion: 56
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 57
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 19
Tipo: TR_NUMERO
Valor: 19
-----------------------------------------------Direccion: 58
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 59
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 21
Tipo: TR_NUMERO
Valor: 21
-----------------------------------------------Direccion: 60
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 61
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 62
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 63
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 64
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
------------------------------------------------

Compiladores

111

Grupo 98

C# Compiler

Direccion: 65
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 66
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 67
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 68
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 69
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 70
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 71
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 72
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 23
Tipo: TR_NUMERO
Valor: 23
-----------------------------------------------Direccion: 73
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 74
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 25
Tipo: TR_NUMERO
Valor: 25
-----------------------------------------------Direccion: 75
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 76
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 27
Tipo: TR_NUMERO
Valor: 27
-----------------------------------------------Direccion: 77

Compiladores

112

Grupo 98

C# Compiler

Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 78
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 79
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 80
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 81
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 82
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 83
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 84
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 85
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 86
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 87
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 88
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 89
Operacion: TR_WRITE_STRING

Compiladores

113

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 29
Tipo: TR_NUMERO
Valor: 29
-----------------------------------------------Direccion: 90
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 91
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 31
Tipo: TR_NUMERO
Valor: 31
-----------------------------------------------Direccion: 92
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 93
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 33
Tipo: TR_NUMERO
Valor: 33
-----------------------------------------------Direccion: 94
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 95
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 96
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 97
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 98
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 99
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase

Compiladores

114

Grupo 98

C# Compiler

E2: NOP ;metodo


MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#1[.IX]
;asignacion informativa
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en el Metodo1
WRSTR /E3
BR /E4
E3: DATA "Estoy en el Metodo1 "
E4: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E5
BR /E6
E5: DATA ","
E6: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E7
BR /E8
E7: DATA "\n"
E8: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP

Compiladores

115

Grupo 98

C# Compiler

RET
E9: NOP ;clase
E10: NOP ;metodo
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en el Metodo2
WRSTR /E11
BR /E12
E11: DATA "Estoy en el Metodo2 "
E12: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E13
BR /E14
E13: DATA ","
E14: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E15
BR /E16
E15: DATA "\n"
E16: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP

Compiladores

116

Grupo 98

E0:

C# Compiler

RET
MOVE .IY,.SP
RET
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Empiezo en Main
WRSTR /E17
BR /E18
E17: DATA "Empiezo en Main "
E18: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E19
BR /E20
E19: DATA ","
E20: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E21
BR /E22
E21: DATA "\n"
E22: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6

Compiladores

117

Grupo 98

C# Compiler

PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #1,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Sigo en Main
WRSTR /E23
BR /E24
E23: DATA "Sigo en Main "
E24: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E25
BR /E26
E25: DATA ","
E26: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n

Compiladores

118

Grupo 98

C# Compiler

WRSTR /E27
BR /E28
E27: DATA "\n"
E28: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E10
CALL /E10
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0

Compiladores

119

Grupo 98

C# Compiler

;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Termino en Main
WRSTR /E29
BR /E30
E29: DATA "Termino en Main "
E30: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E31
BR /E32
E31: DATA ","
E32: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E33
BR /E34
E33: DATA "\n"
E34: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 3
MOVE .SP,.R0
ADD #3,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Empiezo en Main 1,2
Estoy en el Metodo1 3,4
Sigo en Main 1,7
Estoy en el Metodo2 5,6
Termino en Main 5,11

10.8 Prueba 8
prueba108.cs
class prueba {
public short numero1;
public short numero2;

Compiladores

120

Grupo 98

C# Compiler

public short metodo1() {

console.write("Estoy en Metodo1: {0},{1}\n",numero1,numero2);


return numero1+numero2;

}
class prueba2 {
public short numero3;
public short metodo22() {
console.write("Estoy en Metodo22: {0}\n",numero3);
return 22;
}
public short metodo2(short n) {
console.write("Estoy en Metodo2: {0},{1}\n",numero3,n);
return numero3+n;
}

class clase{
short s1;
prueba p1;
prueba p3;
prueba2 p2;
short metodo3() {
return 5;
}
public static void Main(){
short s2;
p1.numero1=2;
p1.numero2=3;
//s1=p1.numero1; //da error que no deberia
s1=2+p1.metodo1()+2; // 9
s2=1+metodo3()+1; // 7
console.write("Estoy en Main: {0},{1},{2},{3}\n",s1,s2,
p1.numero1,p1.numero2);
p2.numero3=4;
p2.metodo22(); //4
p2.metodo2(5); //4,5
console.write("Sigo en Main: {0},{1}\n",p2.numero3,s1); // 4,9
console.write("Estoy en Main: {0},{1},{2},{3}\n",s1,s2,
p1.numero1,p1.numero2);
}
}

Compiladores

121

Grupo 98

C# Compiler

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 5
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 6
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 7
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 8
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 9
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 10
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 11
Operacion: TR_FIN_WRITE_STRING

Compiladores

122

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 14
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 15
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 16
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 17
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 18
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 19
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 20
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 21
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 22
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 23
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 13

Compiladores

123

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 13
-----------------------------------------------Direccion: 24
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 25
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 22
Tipo: TR_NUMERO
Valor: 22
-----------------------------------------------Direccion: 26
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
-----------------------------------------------Direccion: 29
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 30
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 31
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 32
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 33
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 34
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 18
Tipo: TR_NUMERO
Valor: 18
-----------------------------------------------Direccion: 35
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49

Compiladores

124

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 36
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 37
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 38
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 39
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 40
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 41
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 42
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 43
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 22
Tipo: TR_NUMERO
Valor: 22
-----------------------------------------------Direccion: 44
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 23
Tipo: TR_NUMERO
Valor: 23
-----------------------------------------------Direccion: 45
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 46
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 47
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

125

Grupo 98

C# Compiler

Direccion: 48
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 49
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 50
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 51
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 52
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 53
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 54
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 55
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 56
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 57
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 58
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 59
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 60

Compiladores

126

Grupo 98

C# Compiler

Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 61
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 62
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 63
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 64
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 65
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 66
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 67
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 68
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 69
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 70
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 71
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 72
Operacion: TR_SALTO_METODO

Compiladores

127

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 23
Tipo: TR_NUMERO
Valor: 23
-----------------------------------------------Direccion: 73
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 74
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 75
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 76
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 77
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 78
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 79
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 80
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 81
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 82
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 83
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 84
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 24

Compiladores

128

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 85
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 86
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 87
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 88
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 28
Tipo: TR_NUMERO
Valor: 28
-----------------------------------------------Direccion: 89
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 50
Tipo: TR_NUMERO
Valor: 50
-----------------------------------------------Direccion: 90
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 30
Tipo: TR_NUMERO
Valor: 30
-----------------------------------------------Direccion: 91
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 51
Tipo: TR_NUMERO
Valor: 51
-----------------------------------------------Direccion: 92
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 32
Tipo: TR_NUMERO
Valor: 32
-----------------------------------------------Direccion: 93
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 94
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 95
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 96
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5

Compiladores

129

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 97
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 98
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 99
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 100
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 101
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 102
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 103
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 104
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 105
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 106
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 107
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 108
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
------------------------------------------------

Compiladores

130

Grupo 98

C# Compiler

Direccion: 109
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 110
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 111
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 112
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 113
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 114
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 115
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 36
Tipo: TR_NUMERO
Valor: 36
-----------------------------------------------Direccion: 116
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 117
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 38
Tipo: TR_NUMERO
Valor: 38
-----------------------------------------------Direccion: 118
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 119
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 120
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 121

Compiladores

131

Grupo 98

C# Compiler

Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 122
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 123
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 124
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 40
Tipo: TR_NUMERO
Valor: 40
-----------------------------------------------Direccion: 125
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 126
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 127
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 128
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 44
Tipo: TR_NUMERO
Valor: 44
-----------------------------------------------Direccion: 129
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 50
Tipo: TR_NUMERO
Valor: 50
-----------------------------------------------Direccion: 130
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 46
Tipo: TR_NUMERO
Valor: 46
-----------------------------------------------Direccion: 131
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 51
Tipo: TR_NUMERO
Valor: 51
-----------------------------------------------Direccion: 132
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 133
Operacion: TR_FIN_WRITE_STRING

Compiladores

132

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 134
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 135
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 136
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 137
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 138
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Metodo1:
WRSTR /E3
BR /E4
E3: DATA "Estoy en Metodo1: "
E4: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E5
BR /E6
E5: DATA ","
E6: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E7

Compiladores

133

Grupo 98

C# Compiler

BR /E8
E7: DATA "\n"
E8: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E9: NOP ;clase
E10: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Metodo22:
WRSTR /E11
BR /E12
E11: DATA "Estoy en Metodo22: "
E12: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E13
BR /E14
E13: DATA "\n"
E14: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor inmediato 22
MOVE #22,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E15: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Metodo2:
WRSTR /E16

Compiladores

134

Grupo 98

C# Compiler

BR /E17
E16: DATA "Estoy en Metodo2: "
E17: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E18
BR /E19
E18: DATA ","
E19: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E20
BR /E21
E20: DATA "\n"
E21: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E22: NOP ;clase
E23: NOP ;metodo
MOVE .SP,.IY;metodo
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E0:
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#1[.IX]
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 2
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#2[.IX]

Compiladores

135

Grupo 98

C# Compiler

;asignacion informativa
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #1,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3

Compiladores

136

Grupo 98

C# Compiler

ADD .R3,.R0 ;suma


MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E23
CALL /E23
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0

Compiladores

137

Grupo 98

C# Compiler

PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Main:
WRSTR /E24
BR /E25
E24: DATA "Estoy en Main: "
E25: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E26
BR /E27
E26: DATA ","
E27: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string ,
WRSTR /E28
BR /E29
E28: DATA ","
E29: NOP ;fin cuerpo
WRINT #2[.IY] ;write short
;cuerpo write string ,
WRSTR /E30
BR /E31
E30: DATA ","
E31: NOP ;fin cuerpo
WRINT #3[.IY] ;write short
;cuerpo write string \n
WRSTR /E32
BR /E33
E32: DATA "\n"
E33: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;asignacion informativa

Compiladores

138

Grupo 98

C# Compiler

;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 5
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#5[.IX]
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #5,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E10
CALL /E10
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3

Compiladores

139

Grupo 98

C# Compiler

PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #5,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E15
CALL /E15
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #5[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Sigo en Main:
WRSTR /E34
BR /E35
E34: DATA "Sigo en Main: "
E35: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E36
BR /E37
E36: DATA ","
E37: NOP ;fin cuerpo

Compiladores

140

Grupo 98

C# Compiler

WRINT #1[.IY] ;write short


;cuerpo write string \n
WRSTR /E38
BR /E39
E38: DATA "\n"
E39: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Main:
WRSTR /E40
BR /E41
E40: DATA "Estoy en Main: "
E41: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E42
BR /E43
E42: DATA ","
E43: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string ,
WRSTR /E44
BR /E45
E44: DATA ","
E45: NOP ;fin cuerpo
WRINT #2[.IY] ;write short
;cuerpo write string ,
WRSTR /E46
BR /E47
E46: DATA ","
E47: NOP ;fin cuerpo
WRINT #3[.IY] ;write short
;cuerpo write string \n
WRSTR /E48
BR /E49
E48: DATA "\n"
E49: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 6
MOVE .SP,.R0
ADD #6,.SP
MOVE .A,.SP

Compiladores

141

Grupo 98

C# Compiler

;Crear registro metodo tamano 1


MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0

HALT
INICIO_PILA:

Ejecucin
Estoy en Metodo1: 2,3
Estoy en Main: 9,7,2,3
Estoy en Metodo22: 4
Estoy en Metodo2: 4,5
Sigo en Main: 4,9
Estoy en Main: 9,7,2,3

10.9 Prueba 9
prueba109.cs
class prueba {
public short numero1;
public short metodo1() {

console.write("Estoy en Metodo1: {0}\n",numero1);


return 1;

}
class prueba2 {
public short numero2;
public short metodo2(short n) {
console.write("Estoy en Metodo2: {0},{1}\n",n,numero2);
return 2;
}

class clase{
prueba p1;
prueba2 p2;
public static void Main(){

Compiladores

142

Grupo 98

C# Compiler

p1.numero1=5;
p2.numero2=6;
p2.metodo2(p1.numero1); //5,6
console.write("Estoy en Main: {0},{1}\n",p1.numero1,p2.numero2);
}
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 5
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 6
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 7
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 8
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 9
Operacion: TR_VALOR_INMEDIATO

Compiladores

143

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 10
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 11
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 13
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 14
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 16
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 9
Tipo: TR_NUMERO
Valor: 9
-----------------------------------------------Direccion: 18
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 19
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 20
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 21
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 13

Compiladores

144

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 13
-----------------------------------------------Direccion: 22
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 23
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 24
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 25
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 26
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 15
Tipo: TR_NUMERO
Valor: 15
-----------------------------------------------Direccion: 27
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 29
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 30
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 31
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 32
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 33
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1

Compiladores

145

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 34
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 35
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 36
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 37
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 38
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 39
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 40
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 41
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 42
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 43
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 44
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 45
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
------------------------------------------------

Compiladores

146

Grupo 98

C# Compiler

Direccion: 46
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 47
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 18
Tipo: TR_NUMERO
Valor: 18
-----------------------------------------------Direccion: 48
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 49
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 50
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 51
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 52
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 53
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 54
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 55
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string

Compiladores

147

Grupo 98

C# Compiler

;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Metodo1:
WRSTR /E3
BR /E4
E3: DATA "Estoy en Metodo1: "
E4: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E5
BR /E6
E5: DATA "\n"
E6: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E7: NOP ;clase
E8: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Metodo2:
WRSTR /E9
BR /E10
E9: DATA "Estoy en Metodo2: "
E10: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E11
BR /E12
E11: DATA ","
E12: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E13
BR /E14
E13: DATA "\n"
E14: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E15: NOP ;clase

Compiladores

148

Grupo 98

E0:

C# Compiler

MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#1[.IX]
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #1,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E8
CALL /E8
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3

Compiladores

149

Grupo 98

C# Compiler

POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;cuerpo write string Estoy en Main:
WRSTR /E16
BR /E17
E16: DATA "Estoy en Main: "
E17: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string ,
WRSTR /E18
BR /E19
E18: DATA ","
E19: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E20
BR /E21
E20: DATA "\n"
E21: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Estoy en Metodo2: 5,6
Estoy en Main: 5,6

Compiladores

150

Grupo 98

C# Compiler

10.10 Prueba 10
prueba110.cs
class prueba {
public short numero1=1;
public short metodo1() {
console.write("Estoy en Metodo1\n");
return numero1;
}

class clase{
short s1;
prueba p1;
public static void Main(){
p1.numero1=5;
s1=p1.numero1;
}

class clase2{
short s1;
prueba p1;
public static void prueba2(){
s1=p1.numero1;
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3

Compiladores

151

Grupo 98

C# Compiler

Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 4
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 5
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 6
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 8
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 9
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 11
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 12
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 13
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 14
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 15
Operacion: TR_ASIGNACION

Compiladores

152

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 16
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 17
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 18
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 19
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 20
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 21
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 22
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 23
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 24
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 25
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 26
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 2

Compiladores

153

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 28
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 29
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Estoy en Metodo1\n
WRSTR /E3
BR /E4
E3: DATA "Estoy en Metodo1\n"
E4: NOP ;fin cuerpo
;valor de variable
MOVE #-2[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E5: NOP ;clase
E0:
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#1[.IX]
;asignacion informativa
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;asignacion pos 0

Compiladores

154

Grupo 98

C# Compiler

POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .IY,.SP
RET
E6: NOP ;clase
E7: NOP ;metodo
MOVE .SP,.IY;metodo
;asignacion informativa
;valor de variable
MOVE #-2[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-2[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
;Crear registro metodo tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Esta prueba no imprime nada por pantalla

10.11 Prueba 11
prueba111.cs
class clase{
public static void Main(){
short num;
num=5;
if (num==1 || num==2 || num==3 ||num == 4) {
//if (num==1 || num==2) {
console.write("hola1\n");
}
else

Compiladores

155

Grupo 98

C# Compiler

console.write("adios1\n");
if (num==5) {
console.write("hola2\n");
}
if (num==1) {
console.write("adios2\n");
}
num=3;
return;
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 6
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 8

Compiladores

156

Grupo 98

C# Compiler

Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 9
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 10
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 11
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 12
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 14
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 15
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 16
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 18
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 19
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 20
Operacion: TR_INICIO_WRITE_STRING

Compiladores

157

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 21
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 12
Tipo: TR_NUMERO
Valor: 12
-----------------------------------------------Direccion: 22
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 23
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 24
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 14
Tipo: TR_NUMERO
Valor: 14
-----------------------------------------------Direccion: 25
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 26
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 28
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 29
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 30
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 31
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 32
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 20

Compiladores

158

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 33
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 34
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 35
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 36
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 37
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 38
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 39
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 22
Tipo: TR_NUMERO
Valor: 22
-----------------------------------------------Direccion: 40
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 41
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 42
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 22
Tipo: TR_NUMERO
Valor: 22
-----------------------------------------------Direccion: 43
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 22
Tipo: TR_NUMERO
Valor: 22
-----------------------------------------------Direccion: 44
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

159

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 45
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 46
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 47
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 48
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 49
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 50
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 51
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 52
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E0:
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE #0,.R3 ;inicio if

Compiladores

160

Grupo 98

C# Compiler

;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 4
POP .R1
POP .R0
CMP .R0,.R1
BZ /E4
BR /E5
E4: MOVE #1,.R3;
E5: NOP; fin comp igual
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;comp igual op 1 eti 6
POP .R1
POP .R0
CMP .R0,.R1
BZ /E6
BR /E7
E6: MOVE #1,.R3;
E7: NOP; fin comp igual
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;comp igual op 1 eti 8
POP .R1
POP .R0
CMP .R0,.R1
BZ /E8
BR /E9
E8: MOVE #1,.R3;
E9: NOP; fin comp igual
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 1 eti 10
POP .R1
POP .R0
CMP .R0,.R1
BZ /E10
BR /E11
E10: MOVE #1,.R3;
E11: NOP; fin comp igual
;cuerpo if

Compiladores

161

Grupo 98

C# Compiler

CMP #0,.R3
BZ /E2
MOVE .SP,.R2 ;incio write string
;cuerpo write string hola1\n
WRSTR /E12
BR /E13
E12: DATA "hola1\n"
E13: NOP ;fin cuerpo
;cuerpo else 2
BR /E3
E2: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string adios1\n
WRSTR /E14
BR /E15
E14: DATA "adios1\n"
E15: NOP ;fin cuerpo
E3: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;comp igual op 1 eti 18
POP .R1
POP .R0
CMP .R0,.R1
BZ /E18
BR /E19
E18: MOVE #1,.R3;
E19: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E16
MOVE .SP,.R2 ;incio write string
;cuerpo write string hola2\n
WRSTR /E20
BR /E21
E20: DATA "hola2\n"
E21: NOP ;fin cuerpo
;cuerpo else 16
BR /E17
E16: NOP
E17: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 24
POP .R1
POP .R0
CMP .R0,.R1
BZ /E24
BR /E25

Compiladores

162

Grupo 98

C# Compiler

E24: MOVE #1,.R3;


E25: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E22
MOVE .SP,.R2 ;incio write string
;cuerpo write string adios2\n
WRSTR /E26
BR /E27
E26: DATA "adios2\n"
E27: NOP ;fin cuerpo
;cuerpo else 22
BR /E23
E22: NOP
E23: NOP; fin if
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
adios1
hola2

10.12 Prueba 12
prueba112.cs
class clase{
public static void Main(){
short num;

Compiladores

163

Grupo 98

C# Compiler

num=4;
//num=0-3;
if (num==1)
console.write("num
else if (num==2)
console.write("num
else if (num==3)
console.write("num
else if (num==4)
console.write("num
else if (num==5)
console.write("num
else
console.write("num

es igual a 1\n");
es igual a 2\n");
es igual a 3\n");
es igual a 4\n");
es igual a 5\n");
es >5 o <1\n");

num=3;
}
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 6
Operacion: TR_INICIO_IF
Tipo: TR_NADA

Compiladores

164

Grupo 98

C# Compiler

Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 8
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 9
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 10
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 11
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 13
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 14
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 16
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 17
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 18
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8

Compiladores

165

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 19
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 20
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 12
Tipo: TR_NUMERO
Valor: 12
-----------------------------------------------Direccion: 21
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 22
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 23
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 24
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 25
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 26
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 14
Tipo: TR_NUMERO
Valor: 14
-----------------------------------------------Direccion: 27
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 18
Tipo: TR_NUMERO
Valor: 18
-----------------------------------------------Direccion: 29
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 14
Tipo: TR_NUMERO
Valor: 14
-----------------------------------------------Direccion: 30
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

166

Grupo 98

C# Compiler

Direccion: 31
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 32
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 33
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 34
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 35
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 36
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 37
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 38
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 39
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 40
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 41
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 42
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 43

Compiladores

167

Grupo 98

C# Compiler

Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 44
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 30
Tipo: TR_NUMERO
Valor: 30
-----------------------------------------------Direccion: 45
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 46
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 47
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 32
Tipo: TR_NUMERO
Valor: 32
-----------------------------------------------Direccion: 48
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 49
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 50
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 14
Tipo: TR_NUMERO
Valor: 14
-----------------------------------------------Direccion: 51
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 52
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 53
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 54
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 55
Operacion: TR_ASIGNACION

Compiladores

168

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 56
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 57
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 58
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 59
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 60
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E0:
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 4
POP .R1
POP .R0
CMP .R0,.R1
BZ /E4
BR /E5
E4: MOVE #1,.R3;

Compiladores

169

Grupo 98

C# Compiler

E5: NOP; fin comp igual


;cuerpo if
CMP #0,.R3
BZ /E2
MOVE .SP,.R2 ;incio write string
;cuerpo write string num es igual a 1\n
WRSTR /E6
BR /E7
E6: DATA "num es igual a 1\n"
E7: NOP ;fin cuerpo
;cuerpo else 2
BR /E3
E2: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;comp igual op 1 eti 10
POP .R1
POP .R0
CMP .R0,.R1
BZ /E10
BR /E11
E10: MOVE #1,.R3;
E11: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E8
MOVE .SP,.R2 ;incio write string
;cuerpo write string num es igual a 2\n
WRSTR /E12
BR /E13
E12: DATA "num es igual a 2\n"
E13: NOP ;fin cuerpo
;cuerpo else 8
BR /E9
E8: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;comp igual op 1 eti 16
POP .R1
POP .R0
CMP .R0,.R1
BZ /E16
BR /E17
E16: MOVE #1,.R3;
E17: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E14
MOVE .SP,.R2 ;incio write string

Compiladores

170

Grupo 98

C# Compiler

;cuerpo write string num es igual a 3\n


WRSTR /E18
BR /E19
E18: DATA "num es igual a 3\n"
E19: NOP ;fin cuerpo
;cuerpo else 14
BR /E15
E14: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 1 eti 22
POP .R1
POP .R0
CMP .R0,.R1
BZ /E22
BR /E23
E22: MOVE #1,.R3;
E23: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E20
MOVE .SP,.R2 ;incio write string
;cuerpo write string num es igual a 4\n
WRSTR /E24
BR /E25
E24: DATA "num es igual a 4\n"
E25: NOP ;fin cuerpo
;cuerpo else 20
BR /E21
E20: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;comp igual op 1 eti 28
POP .R1
POP .R0
CMP .R0,.R1
BZ /E28
BR /E29
E28: MOVE #1,.R3;
E29: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E26
MOVE .SP,.R2 ;incio write string
;cuerpo write string num es igual a 5\n
WRSTR /E30
BR /E31
E30: DATA "num es igual a 5\n"
E31: NOP ;fin cuerpo

Compiladores

171

Grupo 98

C# Compiler

;cuerpo else 26
BR /E27
E26: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string num es >5 o <1\n
WRSTR /E32
BR /E33
E32: DATA "num es >5 o <1\n"
E33: NOP ;fin cuerpo
E27: NOP; fin if
E21: NOP; fin if
E15: NOP; fin if
E9: NOP; fin if
E3: NOP; fin if
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
num es igual a 4

10.13 Prueba 13
prueba113.cs
class clase{
public static void Main(){
short num;
num=4;

Compiladores

172

Grupo 98

C# Compiler

if (num==4) //verdadero
console.write("verdadero\n");
else
console.write("falso\n");
if (num>5) //falso
console.write("verdadero\n");
else
console.write("falso\n");
if (num<5) //verdadero
console.write("verdadero\n");
else
console.write("falso\n");
if (num!=4) //false
console.write("verdadero\n");
else
console.write("falso\n");
if (num>=4) //verdarero
console.write("verdadero\n");
else
console.write("falso\n");
if (num<=10) //verdarero
console.write("verdadero\n");
else
console.write("falso\n");
}
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_INMEDIATO

Compiladores

173

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 5
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 6
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 8
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 9
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 10
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 11
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 13
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 14
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 16
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 2

Compiladores

174

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 17
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 19
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 20
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 21
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 22
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 23
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 14
Tipo: TR_NUMERO
Valor: 14
-----------------------------------------------Direccion: 24
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 25
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 26
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 27
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 28
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

175

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 29
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 30
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 31
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 32
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 18
Tipo: TR_NUMERO
Valor: 18
-----------------------------------------------Direccion: 33
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 34
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 22
Tipo: TR_NUMERO
Valor: 22
-----------------------------------------------Direccion: 35
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 18
Tipo: TR_NUMERO
Valor: 18
-----------------------------------------------Direccion: 36
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 37
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 38
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 18
Tipo: TR_NUMERO
Valor: 18
-----------------------------------------------Direccion: 39
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 40
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
------------------------------------------------

Compiladores

176

Grupo 98

C# Compiler

Direccion: 41
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 42
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 43
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 44
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 45
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 30
Tipo: TR_NUMERO
Valor: 30
-----------------------------------------------Direccion: 46
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 47
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 48
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 32
Tipo: TR_NUMERO
Valor: 32
-----------------------------------------------Direccion: 49
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 26
Tipo: TR_NUMERO
Valor: 26
-----------------------------------------------Direccion: 50
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 51
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 52
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 53

Compiladores

177

Grupo 98

C# Compiler

Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 54
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 55
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 56
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 38
Tipo: TR_NUMERO
Valor: 38
-----------------------------------------------Direccion: 57
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 58
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 59
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 40
Tipo: TR_NUMERO
Valor: 40
-----------------------------------------------Direccion: 60
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 61
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 62
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 63
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 64
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 65
Operacion: TR_CUERPO_IF

Compiladores

178

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 66
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 67
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 46
Tipo: TR_NUMERO
Valor: 46
-----------------------------------------------Direccion: 68
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 69
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 70
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 71
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 72
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 73
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 74
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 75
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 76
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens

Compiladores

179

Grupo 98

C# Compiler

MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E0:
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 1 eti 4
POP .R1
POP .R0
CMP .R0,.R1
BZ /E4
BR /E5
E4: MOVE #1,.R3;
E5: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E2
MOVE .SP,.R2 ;incio write string
;cuerpo write string verdadero\n
WRSTR /E6
BR /E7
E6: DATA "verdadero\n"
E7: NOP ;fin cuerpo
;cuerpo else 2
BR /E3
E2: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string falso\n
WRSTR /E8
BR /E9
E8: DATA "falso\n"
E9: NOP ;fin cuerpo
E3: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;comp igual op 3 eti 12
POP .R1
POP .R0
CMP .R0,.R1
BZ /E13

Compiladores

180

Grupo 98

C# Compiler

BP /E12
BR /E13
E12: MOVE #1,.R3;
E13: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E10
MOVE .SP,.R2 ;incio write string
;cuerpo write string verdadero\n
WRSTR /E14
BR /E15
E14: DATA "verdadero\n"
E15: NOP ;fin cuerpo
;cuerpo else 10
BR /E11
E10: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string falso\n
WRSTR /E16
BR /E17
E16: DATA "falso\n"
E17: NOP ;fin cuerpo
E11: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 5
MOVE #5,.R0
PUSH .R0
;comp igual op 4 eti 20
POP .R1
POP .R0
CMP .R0,.R1
BN /E20
BR /E21
E20: MOVE #1,.R3;
E21: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E18
MOVE .SP,.R2 ;incio write string
;cuerpo write string verdadero\n
WRSTR /E22
BR /E23
E22: DATA "verdadero\n"
E23: NOP ;fin cuerpo
;cuerpo else 18
BR /E19
E18: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string falso\n
WRSTR /E24
BR /E25
E24: DATA "falso\n"
E25: NOP ;fin cuerpo
E19: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX

Compiladores

181

Grupo 98

C# Compiler

MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 2 eti 28
POP .R1
POP .R0
CMP .R0,.R1
BNZ /E28
BR /E29
E28: MOVE #1,.R3;
E29: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E26
MOVE .SP,.R2 ;incio write string
;cuerpo write string verdadero\n
WRSTR /E30
BR /E31
E30: DATA "verdadero\n"
E31: NOP ;fin cuerpo
;cuerpo else 26
BR /E27
E26: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string falso\n
WRSTR /E32
BR /E33
E32: DATA "falso\n"
E33: NOP ;fin cuerpo
E27: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 5 eti 36
POP .R1
POP .R0
CMP .R0,.R1
BP /E36
BR /E37
E36: MOVE #1,.R3;
E37: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E34
MOVE .SP,.R2 ;incio write string
;cuerpo write string verdadero\n
WRSTR /E38
BR /E39
E38: DATA "verdadero\n"
E39: NOP ;fin cuerpo
;cuerpo else 34
BR /E35
E34: NOP
MOVE .SP,.R2 ;incio write string

Compiladores

182

Grupo 98

C# Compiler

;cuerpo write string falso\n


WRSTR /E40
BR /E41
E40: DATA "falso\n"
E41: NOP ;fin cuerpo
E35: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 10
MOVE #10,.R0
PUSH .R0
;comp igual op 6 eti 44
POP .R1
POP .R0
CMP .R0,.R1
BN /E44
BZ /E44
BR /E45
E44: MOVE #1,.R3;
E45: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E42
MOVE .SP,.R2 ;incio write string
;cuerpo write string verdadero\n
WRSTR /E46
BR /E47
E46: DATA "verdadero\n"
E47: NOP ;fin cuerpo
;cuerpo else 42
BR /E43
E42: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string falso\n
WRSTR /E48
BR /E49
E48: DATA "falso\n"
E49: NOP ;fin cuerpo
E43: NOP; fin if
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin

Compiladores

183

Grupo 98

C# Compiler

verdadero
falso
verdadero
falso
verdadero
verdadero

10.14 Prueba 14
prueba114.cs
class clase{
public static void Main(){
short num;
Console.Write("Escribe un numero: ");
num=Console.Read();
Console.Write("Has escrito un {0}\n",num);
}
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 5

Compiladores

184

Grupo 98

C# Compiler

Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_CONSOLE_READ
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 8
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 9
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 10
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 11
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 12
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 13
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 14
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 15
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 16
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_REGISTRO_METODO

Compiladores

185

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 18
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E0:
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Escribe un numero:
WRSTR /E2
BR /E3
E2: DATA "Escribe un numero: "
E3: NOP ;fin cuerpo
;asignacion informativa
;console read
ININT .R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Has escrito un
WRSTR /E4
BR /E5
E4: DATA "Has escrito un "
E5: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E6
BR /E7
E6: DATA "\n"
E7: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0

Compiladores

186

Grupo 98

C# Compiler

PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Escribe un numero: 2334
Has escrito un 2334

10.15 Prueba 15
prueba115.cs
class aritmetica{
private short mulaux(short a,short b){
if (b==1)
return a;
else if (b==0)
return 0;
else
return a+mulaux(a,b-1);
}
public short mul(short a,short b){
//Console.Write("MUL: {0},{1}\n",a,b);
if (a>=0) // a es positivo
if (b>=0) // b es positivo
return mulaux(a,b);
else // b es negativo
return 0-mulaux(a,0-b);
else // a es negativo
if (b>=0) // b es positivo
return 0-mulaux(0-a,b);
else // b es negativo
return mulaux(0-a,0-b);
}
private short divaux(short a,short b){
if (b==1)
return a;
else if (b>a)
return 0;
else
return 1+divaux(a-b,b);
}
public short div(short a,short b){

Compiladores

187

Grupo 98

C# Compiler

//Console.Write("DIV: {0},{1}\n",a,b);
if (a>=0) // a es positivo
if (b>=0) // b es positivo
return divaux(a,b);
else // b es negativo
return 0-divaux(a,0-b);
else // a es negativo
if (b>=0) // b es positivo
return 0-divaux(0-a,b);
else // b es negativo
return divaux(0-a,0-b);
}
public short mod(short a,short b){
//Console.Write("MOD: {0},{1}\n",a,b);
return a-mul(div(a,b),b);
}
public short fact(short a){
//Console.Write("factorial: {0}\n",a);
if (a<0) {
Console.Write("ERROR: factorial negativo");
return -1;
}
else if (a==0 || a==1)
return 1;
else
return mul(a,fact(a-1));
}

class principal{
aritmetica o;
public static void Main(){
short n1;
short n2;
short op;
Console.Write("\tCALCULADORA\n");
Console.Write("Operacines:\n\n");
Console.Write("1 .. Multiplicar\n");
Console.Write("2 .. Dividir\n");
Console.Write("3 .. Resto\n");
Console.Write("4 .. Factorial\n");
Console.Write("\nIntroduzca la operacion: ");
op = Console.Read();
Console.Write("Introduzca el Operando1: ");
n1 = Console.Read();
if (op!=4) {
Console.Write("Introduzca el Operando2: ");
n2 = Console.Read();
}
if (op==1)

Compiladores

188

Grupo 98

C# Compiler

n1=o.mul(n1,n2);
else if (op==2)
n1=o.div(n1,n2);
else if (op==3)
n1=o.mod(n1,n2);
else if (op==4)
n1=o.fact(n1);
else {
Console.Write("Operacion no definida\n");
op=0;
}
}

if (op!=0) Console.Write("Resultado: {0}\n",n1);

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 5
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 6
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 7
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3

Compiladores

189

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 8
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 9
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 11
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 12
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 14
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 15
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 16
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 19
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
------------------------------------------------

Compiladores

190

Grupo 98

C# Compiler

Direccion: 20
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 21
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 22
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 23
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 24
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 25
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 26
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 28
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 29
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 30
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 31
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 32

Compiladores

191

Grupo 98

C# Compiler

Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 33
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 34
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 7
Tipo: TR_NUMERO
Valor: 7
-----------------------------------------------Direccion: 35
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 36
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 37
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 38
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 39
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 40
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 41
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 42
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 12
Tipo: TR_NUMERO
Valor: 12
-----------------------------------------------Direccion: 43
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 44
Operacion: TR_VALOR_VARIABLE

Compiladores

192

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 45
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 46
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 47
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 48
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 49
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 50
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 51
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 52
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 53
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 54
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 55
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 56
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA

Compiladores

193

Grupo 98

C# Compiler

Tipo: TR_NADA
-----------------------------------------------Direccion: 57
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 58
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 59
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 60
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 61
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 62
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 63
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 64
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 65
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 66
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 67
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 68
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

194

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 69
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 70
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 71
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 72
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 73
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 74
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 16
Tipo: TR_NUMERO
Valor: 16
-----------------------------------------------Direccion: 75
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 12
Tipo: TR_NUMERO
Valor: 12
-----------------------------------------------Direccion: 76
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 77
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 78
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 79
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 80
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
------------------------------------------------

Compiladores

195

Grupo 98

C# Compiler

Direccion: 81
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 82
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 83
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 84
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 85
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 86
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 87
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 88
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 89
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 90
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 91
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 92
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 93

Compiladores

196

Grupo 98

C# Compiler

Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 94
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 95
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 96
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 97
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 98
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 99
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 100
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 101
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 102
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 103
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 104
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 105
Operacion: TR_FIN_ARGUMENTOS

Compiladores

197

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 106
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 107
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 108
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 109
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 110
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 111
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 20
Tipo: TR_NUMERO
Valor: 20
-----------------------------------------------Direccion: 112
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 12
Tipo: TR_NUMERO
Valor: 12
-----------------------------------------------Direccion: 113
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 114
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 115
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 116
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 117
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1

Compiladores

198

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 118
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 119
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 25
Tipo: TR_NUMERO
Valor: 25
-----------------------------------------------Direccion: 120
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 121
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 122
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 25
Tipo: TR_NUMERO
Valor: 25
-----------------------------------------------Direccion: 123
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 124
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 125
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 126
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 127
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 29
Tipo: TR_NUMERO
Valor: 29
-----------------------------------------------Direccion: 128
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 129
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

199

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 130
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 29
Tipo: TR_NUMERO
Valor: 29
-----------------------------------------------Direccion: 131
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 132
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 133
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 134
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 135
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 136
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 137
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 138
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 139
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 140
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 141
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
------------------------------------------------

Compiladores

200

Grupo 98

C# Compiler

Direccion: 142
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 143
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 144
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 145
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 146
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 29
Tipo: TR_NUMERO
Valor: 29
-----------------------------------------------Direccion: 147
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 25
Tipo: TR_NUMERO
Valor: 25
-----------------------------------------------Direccion: 148
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 149
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 33
Tipo: TR_NUMERO
Valor: 33
-----------------------------------------------Direccion: 150
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 151
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 152
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 153
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 154

Compiladores

201

Grupo 98

C# Compiler

Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 155
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 156
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 157
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 158
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 159
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 38
Tipo: TR_NUMERO
Valor: 38
-----------------------------------------------Direccion: 160
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 161
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 162
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 163
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 164
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 165
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 166
Operacion: TR_ACTIVAR_MISMA_CLASE

Compiladores

202

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 167
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 168
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 169
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 170
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 38
Tipo: TR_NUMERO
Valor: 38
-----------------------------------------------Direccion: 171
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 172
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 173
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 174
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 175
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 176
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 177
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 178
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA

Compiladores

203

Grupo 98

C# Compiler

Tipo: TR_NADA
-----------------------------------------------Direccion: 179
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 180
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 181
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 182
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 183
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 184
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 185
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 186
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 38
Tipo: TR_NUMERO
Valor: 38
-----------------------------------------------Direccion: 187
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 188
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 189
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 190
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0

Compiladores

204

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 191
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 192
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 193
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 194
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 195
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 196
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 197
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 198
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 199
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 200
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 201
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 202
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

205

Grupo 98

C# Compiler

Direccion: 203
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 204
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 205
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 206
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 207
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 208
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 209
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 210
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 211
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 212
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 213
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 214
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 215

Compiladores

206

Grupo 98

C# Compiler

Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 216
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 217
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 218
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 219
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 220
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 24
Tipo: TR_NUMERO
Valor: 24
-----------------------------------------------Direccion: 221
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 222
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 223
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 42
Tipo: TR_NUMERO
Valor: 42
-----------------------------------------------Direccion: 224
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 34
Tipo: TR_NUMERO
Valor: 34
-----------------------------------------------Direccion: 225
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 226
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 46
Tipo: TR_NUMERO
Valor: 46
-----------------------------------------------Direccion: 227
Operacion: TR_VALOR_VARIABLE

Compiladores

207

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 228
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 229
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 230
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 231
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 232
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 233
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 234
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 235
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 236
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 237
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 33
Tipo: TR_NUMERO
Valor: 33
-----------------------------------------------Direccion: 238
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 239
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA

Compiladores

208

Grupo 98

C# Compiler

Tipo: TR_NADA
-----------------------------------------------Direccion: 240
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 241
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 242
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 243
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 244
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 245
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 246
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 247
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 248
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 249
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 250
Operacion: TR_METODO
Tipo: TR_NUMERO
Valor: 47
Tipo: TR_NUMERO
Valor: 47
-----------------------------------------------Direccion: 251
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

209

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 252
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 253
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 254
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 255
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 256
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 257
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 52
Tipo: TR_NUMERO
Valor: 52
-----------------------------------------------Direccion: 258
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 259
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 260
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 261
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 262
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 263
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
------------------------------------------------

Compiladores

210

Grupo 98

C# Compiler

Direccion: 264
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 265
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 266
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 267
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 268
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 54
Tipo: TR_NUMERO
Valor: 54
-----------------------------------------------Direccion: 269
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 270
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 271
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 54
Tipo: TR_NUMERO
Valor: 54
-----------------------------------------------Direccion: 272
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 273
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 274
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 275
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 276

Compiladores

211

Grupo 98

C# Compiler

Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 277
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 278
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 279
Operacion: TR_SUMA
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 280
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 281
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 282
Operacion: TR_ACTIVAR_MISMA_CLASE
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 283
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 47
Tipo: TR_NUMERO
Valor: 47
-----------------------------------------------Direccion: 284
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 285
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 286
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 287
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 288
Operacion: TR_ACTIVAR_MISMA_CLASE

Compiladores

212

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 289
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 290
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 291
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 292
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 54
Tipo: TR_NUMERO
Valor: 54
-----------------------------------------------Direccion: 293
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 294
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 295
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 60
Tipo: TR_NUMERO
Valor: 60
-----------------------------------------------Direccion: 296
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 297
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 298
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 61
Tipo: TR_NUMERO
Valor: 61
-----------------------------------------------Direccion: 299
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 300
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 63

Compiladores

213

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 63
-----------------------------------------------Direccion: 301
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 302
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 65
Tipo: TR_NUMERO
Valor: 65
-----------------------------------------------Direccion: 303
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 304
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 67
Tipo: TR_NUMERO
Valor: 67
-----------------------------------------------Direccion: 305
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 306
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 69
Tipo: TR_NUMERO
Valor: 69
-----------------------------------------------Direccion: 307
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 308
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 71
Tipo: TR_NUMERO
Valor: 71
-----------------------------------------------Direccion: 309
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 310
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 73
Tipo: TR_NUMERO
Valor: 73
-----------------------------------------------Direccion: 311
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 312
Operacion: TR_CONSOLE_READ
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

214

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 313
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 314
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 315
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 75
Tipo: TR_NUMERO
Valor: 75
-----------------------------------------------Direccion: 316
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 317
Operacion: TR_CONSOLE_READ
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 318
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 319
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 320
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 321
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 322
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 323
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 77
Tipo: TR_NUMERO
Valor: 77
-----------------------------------------------Direccion: 324
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

215

Grupo 98

C# Compiler

Direccion: 325
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 81
Tipo: TR_NUMERO
Valor: 81
-----------------------------------------------Direccion: 326
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 327
Operacion: TR_CONSOLE_READ
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 328
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 329
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 77
Tipo: TR_NUMERO
Valor: 77
-----------------------------------------------Direccion: 330
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 77
Tipo: TR_NUMERO
Valor: 77
-----------------------------------------------Direccion: 331
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 332
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 333
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 334
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 335
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 83
Tipo: TR_NUMERO
Valor: 83
-----------------------------------------------Direccion: 336
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 337

Compiladores

216

Grupo 98

C# Compiler

Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 338
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 339
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 340
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 341
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 342
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 343
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 344
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 11
Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 345
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 346
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 347
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 348
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 349
Operacion: TR_CUERPO_ELSE

Compiladores

217

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 83
Tipo: TR_NUMERO
Valor: 83
-----------------------------------------------Direccion: 350
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 351
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 352
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 353
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 354
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 87
Tipo: TR_NUMERO
Valor: 87
-----------------------------------------------Direccion: 355
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 356
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 357
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 358
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 359
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 360
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 361
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2

Compiladores

218

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 362
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 363
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 33
Tipo: TR_NUMERO
Valor: 33
-----------------------------------------------Direccion: 364
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 365
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 366
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 367
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 368
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 87
Tipo: TR_NUMERO
Valor: 87
-----------------------------------------------Direccion: 369
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 370
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 371
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 372
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 373
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 91
Tipo: TR_NUMERO
Valor: 91

Compiladores

219

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 374
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 375
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 376
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 377
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 378
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 379
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 380
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 381
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 382
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 46
Tipo: TR_NUMERO
Valor: 46
-----------------------------------------------Direccion: 383
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 384
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 385
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
------------------------------------------------

Compiladores

220

Grupo 98

C# Compiler

Direccion: 386
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 387
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 91
Tipo: TR_NUMERO
Valor: 91
-----------------------------------------------Direccion: 388
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 389
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 390
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 391
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 392
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 95
Tipo: TR_NUMERO
Valor: 95
-----------------------------------------------Direccion: 393
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 394
Operacion: TR_GUARDAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 395
Operacion: TR_INICIO_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 396
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 397
Operacion: TR_FIN_ARGUMENTOS
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 398

Compiladores

221

Grupo 98

C# Compiler

Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 399
Operacion: TR_ACTIVAR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 400
Operacion: TR_SALTO_METODO
Tipo: TR_NUMERO
Valor: 47
Tipo: TR_NUMERO
Valor: 47
-----------------------------------------------Direccion: 401
Operacion: TR_RESTAURAR_ESTADO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 402
Operacion: TR_VALOR_DEVUELTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 403
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 404
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 405
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 95
Tipo: TR_NUMERO
Valor: 95
-----------------------------------------------Direccion: 406
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 407
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 99
Tipo: TR_NUMERO
Valor: 99
-----------------------------------------------Direccion: 408
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 409
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 410
Operacion: TR_ASIGNACION

Compiladores

222

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 411
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 95
Tipo: TR_NUMERO
Valor: 95
-----------------------------------------------Direccion: 412
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 91
Tipo: TR_NUMERO
Valor: 91
-----------------------------------------------Direccion: 413
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 87
Tipo: TR_NUMERO
Valor: 87
-----------------------------------------------Direccion: 414
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 83
Tipo: TR_NUMERO
Valor: 83
-----------------------------------------------Direccion: 415
Operacion: TR_INICIO_IF
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 416
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 417
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 418
Operacion: TR_COMP_IGUAL
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 419
Operacion: TR_CUERPO_IF
Tipo: TR_NUMERO
Valor: 101
Tipo: TR_NUMERO
Valor: 101
-----------------------------------------------Direccion: 420
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 421
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 422
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 105

Compiladores

223

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 105
-----------------------------------------------Direccion: 423
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 424
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 107
Tipo: TR_NUMERO
Valor: 107
-----------------------------------------------Direccion: 425
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 426
Operacion: TR_CUERPO_ELSE
Tipo: TR_NUMERO
Valor: 101
Tipo: TR_NUMERO
Valor: 101
-----------------------------------------------Direccion: 427
Operacion: TR_FIN_IF
Tipo: TR_NUMERO
Valor: 101
Tipo: TR_NUMERO
Valor: 101
-----------------------------------------------Direccion: 428
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 429
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 430
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 431
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 432
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP

Compiladores

224

Grupo 98

C# Compiler

BR /SALTO
E1: NOP ;clase
E2: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 5
POP .R1
POP .R0
CMP .R0,.R1
BZ /E5
BR /E6
E5: MOVE #1,.R3;
E6: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E3
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 3
BR /E4
E3: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 1 eti 9
POP .R1
POP .R0
CMP .R0,.R1
BZ /E9
BR /E10
E9: MOVE #1,.R3;
E10: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E7
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 7
BR /E8
E7: NOP
;valor de variable
MOVE #-3[.IY],.IX

Compiladores

225

Grupo 98

C# Compiler

MOVE #0[.IX],.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX

Compiladores

226

Grupo 98

C# Compiler

POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
E8: NOP; fin if
E4: NOP; fin if
MOVE .IY,.SP
RET
E11: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 5 eti 14
POP .R1
POP .R0
CMP .R0,.R1
BP /E14
BR /E15
E14: MOVE #1,.R3;
E15: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E12
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 5 eti 18
POP .R1
POP .R0
CMP .R0,.R1
BP /E18
BR /E19
E18: MOVE #1,.R3;
E19: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E16
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY

Compiladores

227

Grupo 98

C# Compiler

PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
;cuerpo else 16
BR /E17
E16: NOP
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX

Compiladores

228

Grupo 98

C# Compiler

PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica

Compiladores

229

Grupo 98

C# Compiler

POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
E17: NOP; fin if
;cuerpo else 12
BR /E13
E12: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 5 eti 22
POP .R1
POP .R0
CMP .R0,.R1
BP /E22
BR /E23
E22: MOVE #1,.R3;
E23: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E20
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0

Compiladores

230

Grupo 98

C# Compiler

;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 20
BR /E21
E20: NOP
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado

Compiladores

231

Grupo 98

C# Compiler

MOVE .SP,.R2 ;incio argumentos


;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E2
CALL /E2
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
E21: NOP; fin if
E13: NOP; fin if
MOVE .IY,.SP
RET
E24: NOP ;metodo

Compiladores

232

Grupo 98

C# Compiler

MOVE .SP,.IY;metodo
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 27
POP .R1
POP .R0
CMP .R0,.R1
BZ /E27
BR /E28
E27: MOVE #1,.R3;
E28: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E25
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 25
BR /E26
E25: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;comp igual op 3 eti 31
POP .R1
POP .R0
CMP .R0,.R1
BZ /E32
BP /E31
BR /E32
E31: MOVE #1,.R3;
E32: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E29
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 29
BR /E30
E29: NOP
;valor inmediato 1
MOVE #1,.R0
PUSH .R0

Compiladores

233

Grupo 98

C# Compiler

;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E24
CALL /E24
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR

Compiladores

234

Grupo 98

C# Compiler

POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
ADD .R3,.R0 ;suma
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
E30: NOP; fin if
E26: NOP; fin if
MOVE .IY,.SP
RET
E33: NOP ;metodo
MOVE .SP,.IY;metodo
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 5 eti 36
POP .R1
POP .R0
CMP .R0,.R1
BP /E36
BR /E37
E36: MOVE #1,.R3;
E37: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E34
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 5 eti 40
POP .R1
POP .R0
CMP .R0,.R1
BP /E40
BR /E41
E40: MOVE #1,.R3;
E41: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E38
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A

Compiladores

235

Grupo 98

C# Compiler

PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E24
CALL /E24
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
;cuerpo else 38
BR /E39
E38: NOP
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY

Compiladores

236

Grupo 98

C# Compiler

PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E24
CALL /E24
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3

Compiladores

237

Grupo 98

C# Compiler

SUB .R3,.R0 ;resta


MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
E39: NOP; fin if
;cuerpo else 34
BR /E35
E34: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 5 eti 44
POP .R1
POP .R0
CMP .R0,.R1
BP /E44
BR /E45
E44: MOVE #1,.R3;
E45: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E42
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor de variable

Compiladores

238

Grupo 98

C# Compiler

MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E24
CALL /E24
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 42
BR /E43
E42: NOP
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos

Compiladores

239

Grupo 98

C# Compiler

;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E24
CALL /E24
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
E43: NOP; fin if
E35: NOP; fin if
MOVE .IY,.SP
RET
E46: NOP ;metodo
MOVE .SP,.IY;metodo

Compiladores

240

Grupo 98

C# Compiler

;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E33
CALL /E33
DEC .SP
POP .SP
;restaurar estado
POP .R9

Compiladores

241

Grupo 98

C# Compiler

POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E11
CALL /E11
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
POP .R0 ;operacion aritmetica
POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .IY,.SP
RET
MOVE .IY,.SP
RET
E47: NOP ;metodo

Compiladores

242

Grupo 98

C# Compiler

MOVE .SP,.IY;metodo
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 4 eti 50
POP .R1
POP .R0
CMP .R0,.R1
BN /E50
BR /E51
E50: MOVE #1,.R3;
E51: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E48
MOVE .SP,.R2 ;incio write string
;cuerpo write string ERROR: factorial negativo
WRSTR /E52
BR /E53
E52: DATA "ERROR: factorial negativo"
E53: NOP ;fin cuerpo
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 48
BR /E49
E48: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 1 eti 56
POP .R1
POP .R0
CMP .R0,.R1
BZ /E56
BR /E57
E56: MOVE #1,.R3;
E57: NOP; fin comp igual
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 58
POP .R1
POP .R0
CMP .R0,.R1

Compiladores

243

Grupo 98

C# Compiler

BZ /E58
BR /E59
E58: MOVE #1,.R3;
E59: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E54
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
MOVE .IY,.SP
RET
;cuerpo else 54
BR /E55
E54: NOP
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
POP .R0 ;operacion aritmetica

Compiladores

244

Grupo 98

C# Compiler

POP .R3
SUB .R3,.R0 ;resta
MOVE .A,.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E47
CALL /E47
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro misma clase
MOVE #-2[.IY],.R0
PUSH .R0
;Salto a metodo misma clase etiqueta E11
CALL /E11
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX

Compiladores

245

Grupo 98

C# Compiler

POP .SR
POP .SP
;fin de restaurar estado
MOVE .IY,.SP
RET
E55: NOP; fin if
E49: NOP; fin if
MOVE .IY,.SP
RET
E60: NOP ;clase
E0:
MOVE .SP,.IY;metodo
MOVE .SP,.R2 ;incio write string
;cuerpo write string \tCALCULADORA\n
WRSTR /E61
BR /E62
E61: DATA "\tCALCULADORA\n"
E62: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;cuerpo write string Operacines:\n\n
WRSTR /E63
BR /E64
E63: DATA "Operacines:\n\n"
E64: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;cuerpo write string 1 .. Multiplicar\n
WRSTR /E65
BR /E66
E65: DATA "1 .. Multiplicar\n"
E66: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;cuerpo write string 2 .. Dividir\n
WRSTR /E67
BR /E68
E67: DATA "2 .. Dividir\n"
E68: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;cuerpo write string 3 .. Resto\n
WRSTR /E69
BR /E70
E69: DATA "3 .. Resto\n"
E70: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;cuerpo write string 4 .. Factorial\n
WRSTR /E71
BR /E72
E71: DATA "4 .. Factorial\n"
E72: NOP ;fin cuerpo
MOVE .SP,.R2 ;incio write string
;cuerpo write string \nIntroduzca la operacion:
WRSTR /E73
BR /E74
E73: DATA "\nIntroduzca la operacion: "
E74: NOP ;fin cuerpo
;asignacion informativa
;console read
ININT .R0
PUSH .R0
;asignacion pos 2
POP .R0
MOVE #-3[.IY],.IX

Compiladores

246

Grupo 98

C# Compiler

MOVE .R0,#2[.IX]
MOVE .SP,.R2 ;incio write string
;cuerpo write string Introduzca el Operando1:
WRSTR /E75
BR /E76
E75: DATA "Introduzca el Operando1: "
E76: NOP ;fin cuerpo
;asignacion informativa
;console read
ININT .R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 2 eti 79
POP .R1
POP .R0
CMP .R0,.R1
BNZ /E79
BR /E80
E79: MOVE #1,.R3;
E80: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E77
MOVE .SP,.R2 ;incio write string
;cuerpo write string Introduzca el Operando2:
WRSTR /E81
BR /E82
E81: DATA "Introduzca el Operando2: "
E82: NOP ;fin cuerpo
;asignacion informativa
;console read
ININT .R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#1[.IX]
;cuerpo else 77
BR /E78
E77: NOP
E78: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;comp igual op 1 eti 85

Compiladores

247

Grupo 98

C# Compiler

POP .R1
POP .R0
CMP .R0,.R1
BZ /E85
BR /E86
E85: MOVE #1,.R3;
E86: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E83
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #0,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E11
CALL /E11
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A

Compiladores

248

Grupo 98

C# Compiler

POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;cuerpo else 83
BR /E84
E83: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;comp igual op 1 eti 89
POP .R1
POP .R0
CMP .R0,.R1
BZ /E89
BR /E90
E89: MOVE #1,.R3;
E90: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E87
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX

Compiladores

249

Grupo 98

C# Compiler

MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #0,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E33
CALL /E33
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;cuerpo else 87
BR /E88
E87: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;comp igual op 1 eti 93
POP .R1
POP .R0
CMP .R0,.R1
BZ /E93
BR /E94
E93: MOVE #1,.R3;
E94: NOP; fin comp igual

Compiladores

250

Grupo 98

C# Compiler

;cuerpo if
CMP #0,.R3
BZ /E91
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 2
MOVE .SP,.R0
ADD #2,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #0,.R0
PUSH .A
;Salto a metodo misma clase etiqueta E46
CALL /E46
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0

Compiladores

251

Grupo 98

C# Compiler

;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;cuerpo else 91
BR /E92
E91: NOP
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;comp igual op 1 eti 97
POP .R1
POP .R0
CMP .R0,.R1
BZ /E97
BR /E98
E97: MOVE #1,.R3;
E98: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E95
;asignacion informativa
;guardar estado
PUSH .SP
PUSH .SR
PUSH .IX
PUSH .IY
PUSH .A
PUSH .R1
PUSH .R2
PUSH .R3
PUSH .R4
PUSH .R5
PUSH .R6
PUSH .R7
PUSH .R8
PUSH .R9
;fin de guardar estado
MOVE .SP,.R2 ;incio argumentos
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
MOVE .R2,.SP ;fin argumentos
;Crear registro metodo tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
PUSH .R0
;activar registro clase
MOVE #-2[.IY],.R0
ADD #0,.R0

Compiladores

252

Grupo 98

C# Compiler

PUSH .A
;Salto a metodo misma clase etiqueta E47
CALL /E47
DEC .SP
POP .SP
;restaurar estado
POP .R9
POP .R8
POP .R7
POP .R6
POP .R5
POP .R4
POP .R3
POP .R2
POP .R1
POP .A
POP .IY
POP .IX
POP .SR
POP .SP
;fin de restaurar estado
;valor devuelto
PUSH .R0
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;cuerpo else 95
BR /E96
E95: NOP
MOVE .SP,.R2 ;incio write string
;cuerpo write string Operacion no definida\n
WRSTR /E99
BR /E100
E99: DATA "Operacion no definida\n"
E100: NOP ;fin cuerpo
;asignacion informativa
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;asignacion pos 2
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#2[.IX]
E96: NOP; fin if
E92: NOP; fin if
E88: NOP; fin if
E84: NOP; fin if
MOVE #0,.R3 ;inicio if
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;valor inmediato 0
MOVE #0,.R0
PUSH .R0
;comp igual op 2 eti 103

Compiladores

253

Grupo 98

C# Compiler

POP .R1
POP .R0
CMP .R0,.R1
BNZ /E103
BR /E104
E103: MOVE #1,.R3;
E104: NOP; fin comp igual
;cuerpo if
CMP #0,.R3
BZ /E101
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Resultado:
WRSTR /E105
BR /E106
E105: DATA "Resultado: "
E106: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E107
BR /E108
E107: DATA "\n"
E108: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
;cuerpo else 101
BR /E102
E101: NOP
E102: NOP; fin if
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 0
MOVE .SP,.R0
ADD #0,.SP
MOVE .A,.SP
;Crear registro metodo tamano 3
MOVE .SP,.R0
ADD #3,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
CALCULADORA
Operacines:

Compiladores

254

Grupo 98

1
2
3
4

..
..
..
..

C# Compiler

Multiplicar
Dividir
Resto
Factorial

Introduzca la operacion: 4
Introduzca el Operando1: 7
Resultado: 5040

10.16 Prueba 16
prueba116.cs
class clase{
short [] w = new short [5];
public static void Main(){
short numero1;
short [] v = new short [10];
v[4]=3;
numero1=v[4];
w[2]=v[4];
w[2]=numero1;
w[2]=6;
Console.Write("Resultados: v[4]={0},
numero1={1}\n",v[4],numero1);
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

255

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 3
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 4
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 5
Operacion: TR_FIN_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 8
Operacion: TR_ASIGNACION_VECTOR
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 9
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 10
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 11
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 12
Operacion: TR_FIN_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_VARIABLE_VECTOR
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 14
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
------------------------------------------------

Compiladores

256

Grupo 98

C# Compiler

Direccion: 15
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 16
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 17
Operacion: TR_FIN_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 18
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 19
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 20
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 21
Operacion: TR_FIN_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 22
Operacion: TR_VALOR_VARIABLE_VECTOR
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 23
Operacion: TR_ASIGNACION_VECTOR
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 24
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 25
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 26
Operacion: TR_FIN_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27

Compiladores

257

Grupo 98

C# Compiler

Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 29
Operacion: TR_ASIGNACION_VECTOR
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 30
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 31
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 32
Operacion: TR_FIN_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 33
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 34
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 35
Operacion: TR_ASIGNACION_VECTOR
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 36
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 37
Operacion: TR_INICIO_VECTOR
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 38
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 39
Operacion: TR_FIN_VECTOR

Compiladores

258

Grupo 98

C# Compiler

Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 40
Operacion: TR_VALOR_VARIABLE_VECTOR
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 41
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 42
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 43
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 44
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 45
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 49
Tipo: TR_NUMERO
Valor: 49
-----------------------------------------------Direccion: 46
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 47
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 48
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 49
Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 50
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 5
Tipo: TR_NUMERO
Valor: 5
-----------------------------------------------Direccion: 51
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 11

Compiladores

259

Grupo 98

C# Compiler

Tipo: TR_NUMERO
Valor: 11
-----------------------------------------------Direccion: 52
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
E0:
MOVE .SP,.IY;metodo
;inicio vector
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;Fin vector
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion vector pos 1
POP .R0
MOVE #-3[.IY],.IX
POP .A
ADD #1,.A
ADD .IX,.A
MOVE .R0,[.A]
;asignacion informativa
;inicio vector
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;Fin vector
;valor de variable vector
MOVE #-3[.IY],.IX
POP .A
ADD #1,.A
ADD .IX,.A
MOVE [.A],.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;inicio vector
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;Fin vector
;asignacion informativa
;inicio vector
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;Fin vector

Compiladores

260

Grupo 98

C# Compiler

;valor de variable vector


MOVE #-3[.IY],.IX
POP .A
ADD #1,.A
ADD .IX,.A
MOVE [.A],.R0
PUSH .R0
;asignacion vector pos 0
POP .R0
MOVE #-2[.IY],.IX
POP .A
ADD #0,.A
ADD .IX,.A
MOVE .R0,[.A]
;inicio vector
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;Fin vector
;asignacion informativa
;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;asignacion vector pos 0
POP .R0
MOVE #-2[.IY],.IX
POP .A
ADD #0,.A
ADD .IX,.A
MOVE .R0,[.A]
;inicio vector
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;Fin vector
;asignacion informativa
;valor inmediato 6
MOVE #6,.R0
PUSH .R0
;asignacion vector pos 0
POP .R0
MOVE #-2[.IY],.IX
POP .A
ADD #0,.A
ADD .IX,.A
MOVE .R0,[.A]
MOVE .SP,.R2 ;incio write string
;inicio vector
;valor inmediato 4
MOVE #4,.R0
PUSH .R0
;Fin vector
;valor de variable vector
MOVE #-3[.IY],.IX
POP .A
ADD #1,.A
ADD .IX,.A
MOVE [.A],.R0
PUSH .R0
;valor de variable

Compiladores

261

Grupo 98

C# Compiler

MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Resultados: v[4]=
WRSTR /E2
BR /E3
E2: DATA "Resultados: v[4]="
E3: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string , numero1=
WRSTR /E4
BR /E5
E4: DATA ", numero1="
E5: NOP ;fin cuerpo
WRINT #1[.IY] ;write short
;cuerpo write string \n
WRSTR /E6
BR /E7
E6: DATA "\n"
E7: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 5
MOVE .SP,.R0
ADD #5,.SP
MOVE .A,.SP
;Crear registro metodo tamano 11
MOVE .SP,.R0
ADD #11,.SP
MOVE .A,.SP
PUSH .R0
PUSH #INICIO_PILA
CALL /E0
HALT
INICIO_PILA:

Ejecucin
Resultados: v[4]=3, numero1=3

10.17 Prueba 17
prueba117.cs
class clase{
short numero4=1;
public static void Main(){
short numero1=1,numero2=2;
short numero3=3;

Compiladores

262

Grupo 98

C# Compiler

Console.Write("Resultados: numero1={0}\n",numero1);
Console.Write("Resultados: numero2={0}\n",numero2);
Console.Write("Resultados: numero3={0}\n",numero3);
}

salida.ter
-----------------------------------------------Direccion: 0
Operacion: TR_INICIO_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 1
Operacion: TR_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 2
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 3
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 4
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 5
Operacion: TR_METODO_MAIN
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 6
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 7
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 8
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 9
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA

Compiladores

263

Grupo 98

C# Compiler

-----------------------------------------------Direccion: 10
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 11
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 12
Operacion: TR_ASIGNACION_INFORMATIVA
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 13
Operacion: TR_VALOR_INMEDIATO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 14
Operacion: TR_ASIGNACION
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 15
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 16
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 0
Tipo: TR_NUMERO
Valor: 0
-----------------------------------------------Direccion: 17
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 18
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 19
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 4
Tipo: TR_NUMERO
Valor: 4
-----------------------------------------------Direccion: 20
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 21
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
------------------------------------------------

Compiladores

264

Grupo 98

C# Compiler

Direccion: 22
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 23
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 6
Tipo: TR_NUMERO
Valor: 6
-----------------------------------------------Direccion: 24
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 25
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 8
Tipo: TR_NUMERO
Valor: 8
-----------------------------------------------Direccion: 26
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 27
Operacion: TR_INICIO_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 28
Operacion: TR_VALOR_VARIABLE
Tipo: TR_NUMERO
Valor: 2
Tipo: TR_NUMERO
Valor: 2
-----------------------------------------------Direccion: 29
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 10
Tipo: TR_NUMERO
Valor: 10
-----------------------------------------------Direccion: 30
Operacion: TR_WRITE_SHORT
Tipo: TR_NUMERO
Valor: 48
Tipo: TR_NUMERO
Valor: 48
-----------------------------------------------Direccion: 31
Operacion: TR_WRITE_STRING
Tipo: TR_NUMERO
Valor: 12
Tipo: TR_NUMERO
Valor: 12
-----------------------------------------------Direccion: 32
Operacion: TR_FIN_WRITE_STRING
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 33
Operacion: TR_METODO_RET
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 34

Compiladores

265

Grupo 98

C# Compiler

Operacion: TR_SALTO
Tipo: TR_NADA
Tipo: TR_NADA
-----------------------------------------------Direccion: 35
Operacion: TR_REGISTRO_CLASE
Tipo: TR_NUMERO
Valor: 1
Tipo: TR_NUMERO
Valor: 1
-----------------------------------------------Direccion: 36
Operacion: TR_REGISTRO_METODO
Tipo: TR_NUMERO
Valor: 3
Tipo: TR_NUMERO
Valor: 3
-----------------------------------------------Direccion: 37
Operacion: TR_FIN_PROGRAMA
Tipo: TR_NADA
Tipo: TR_NADA

salida.ens
MOVE #INICIO_PILA,.SP
BR /SALTO
E1: NOP ;clase
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
E0:
MOVE .SP,.IY;metodo
;asignacion informativa
;valor inmediato 1
MOVE #1,.R0
PUSH .R0
;asignacion pos 0
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#0[.IX]
;asignacion informativa
;valor inmediato 2
MOVE #2,.R0
PUSH .R0
;asignacion pos 1
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#1[.IX]
;asignacion informativa
;valor inmediato 3
MOVE #3,.R0
PUSH .R0
;asignacion pos 2
POP .R0
MOVE #-3[.IY],.IX
MOVE .R0,#2[.IX]

Compiladores

266

Grupo 98

C# Compiler

MOVE .SP,.R2 ;incio write string


;valor de variable
MOVE #-3[.IY],.IX
MOVE #0[.IX],.R0
PUSH .R0
;cuerpo write string Resultados: numero1=
WRSTR /E2
BR /E3
E2: DATA "Resultados: numero1="
E3: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E4
BR /E5
E4: DATA "\n"
E5: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #1[.IX],.R0
PUSH .R0
;cuerpo write string Resultados: numero2=
WRSTR /E6
BR /E7
E6: DATA "Resultados: numero2="
E7: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E8
BR /E9
E8: DATA "\n"
E9: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .SP,.R2 ;incio write string
;valor de variable
MOVE #-3[.IY],.IX
MOVE #2[.IX],.R0
PUSH .R0
;cuerpo write string Resultados: numero3=
WRSTR /E10
BR /E11
E10: DATA "Resultados: numero3="
E11: NOP ;fin cuerpo
WRINT #0[.IY] ;write short
;cuerpo write string \n
WRSTR /E12
BR /E13
E12: DATA "\n"
E13: NOP ;fin cuerpo
MOVE .R2,.SP ;fin write string
MOVE .IY,.SP
RET
SALTO:
;Crear registro clase tamano 1
MOVE .SP,.R0
ADD #1,.SP
MOVE .A,.SP
;Crear registro metodo tamano 3
MOVE .SP,.R0
ADD #3,.SP

Compiladores

267

Grupo 98

MOVE
PUSH
PUSH
CALL

C# Compiler

.A,.SP
.R0
#INICIO_PILA
/E0

HALT
INICIO_PILA:

Ejecucin
Resultados: numero1=1
Resultados: numero2=2
Resultados: numero3=3

10.18 Prueba 18
Esta prueba se encarga de tratar un error sintactico. Dicho error se detecta cuando
encontramos la declaracion de un atributo en el que hemos incluido el metodo especial
get y, sin embargo, no el set.
prueba1.cs
class clase{
short numero3;
void metodo1() {
console.write("Estoy en el metodo1\n");
}
short atributo{
get
{
numero3=2;
}
}
public static void Main(){
short numero1;
short numero2;
metodo1();
console.write("hola\n");
numero1=4;
numero2=5-2+3-7; //=-1
numero3=6;
numero1=numero3;
numero1=numero2+5-1; //=3
numero3=2-numero3-numero2+numero1+5; //=2-6-(-1)+3+5=5
console.write("n1: {0}\nn2: {1}\nn3: {2}\n",numero1,numero2,
numero3);
console.write("adios\n");
}
}

Compiladores

268

Grupo 98

C# Compiler

Lnea de comandos
C:\CSC\Debug> csc.exe o ..\pruebas\prueba1.cs salida
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba1.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba1.cs", Line 15: Sintactic Error: #21: Atribute not
valid
Generador de Codigo: ERROR: Metodo Main no encontrado

10.19 Prueba 19
En esta prueba podemos observar que se produce un error de tipo semntico debido a la
asignacin. Se intenta asignar un string a una variable de tipo short, y eso no es
correcto.
prueba2.cs
class clase{
short numero3;
public static void Main(){
short numero1;
short numero2;

console.write("hola\n");
numero1="hola"; //n1=4
numero2=3; //n2=3
numero1+=3+1; //n1=8
numero1-=5-numero2; // =n1=8-2=6
console.write("n1: {0}\n",numero1);
console.write("adios\n");

Lnea de comandos
C:\CSC\Debug> csc.exe o ..\pruebas\prueba2.cs salida
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba2.cs
Fichero Salida: salida
Compilando...

Compiladores

269

Grupo 98

C# Compiler

"..\pruebas\prueba2.cs", Line 12: Semantic Error: #104: types not


equal in Sentencia
"..\pruebas\prueba2.cs", Line 12: Sintactic Error: #3: token '}'
expected
Generador de Codigo: ERROR: Metodo Main no encontrado

10.20 Prueba 20
Esta prueba detecta que no se permiten shorts con rango superior a 65535. En caso de
serlo, se produce un error lxico.
prueba3.cs
class clase{
short numero3=66666666;
void metodo1() {
console.write("Estoy en el metodo1\n");
}
void metodo2() {
console.write("Estoy en el metodo2\n");
}
public static void Main(){
short n1;

n1=5;
metodo1();
n1+=3;
console.write("Estoy en Main {0}\n",n1);
metodo2();

Lnea de comandos
C:\CSC\Debug> csc.exe o ..\pruebas\prueba3.cs salida
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba3.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba3.cs", Line 4: Lexer Error: #150: Short Token not
valid
"..\pruebas\prueba3.cs", Line 4: Sintactic Error: #15: 'Primario' not
valid
Generador de Codigo: ERROR: Metodo Main no encontrado

10.21 Prueba 21

Compiladores

270

Grupo 98

C# Compiler

Esta prueba simplemente detecta que no existe un metodo main, o que si existe no tiene
los campos public y static necesarios.
prueba4.cs
class clase{
short numero3;
short metodo1() {
console.write("Estoy en el metodo1\n");
numero3=10;
return 5+numero3;
}
public void main(){
short n1;
n1=metodo1();
console.write("Estoy en main {0}\n",n1);
n1=3+metodo1()+1;
console.write("Sigo en main {0}\n",n1);
}

Lnea de comandos
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba4.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba4.cs", Line 23: Semantic Error: #101: not a main
method in file
Generador de Codigo: ERROR: Metodo Main no encontrado

10.22 Prueba 22
Esta prueba demuestra que el compilador controla si el metodo declarado debe devolver
algo o no. En caso se ser de tipo void, el compilador permite poner return o no.
prueba5.cs
class clase{
short num;
short metodo1(short n1,short n2) {
console.write("Metodo1: n1={0}, n2={1}\n",n1,n2);
console.write("Metodo1: n1+n2={0}\n",n1+n2);

Compiladores

271

Grupo 98

C# Compiler

}
public static void Main(){
num=1;
console.write("Estoy en Main\n");
console.write("Resultado de metodo1: {0}\n",metodo1(5,6));
metodo1(5+num,6);
}
}

Lnea de comandos
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba5.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba5.cs", Line 10: Semantic Error: #128: not return val
in method
"..\pruebas\prueba5.cs", Line 10: Sintactic Error: #3: token '}'
expected
Generador de Codigo: ERROR: Metodo Main no encontrado

10.23 Prueba 23
En esta prueba de demuestra que el compilador es capaz de saber en que momento se
esta ejecutando la palabra especial value. Por tanto, el compilador generar error,
cuando dicha palabra no se situe dentro de la declaracion de un atributo.
prueba6.cs
class prueba {
public short numero1=1;
public short metodo1() {
console.write("Estoy en Metodo1\n");
return numero1;
}

class clase{
short s1;
prueba p1;
public static void Main(){
p1.numero1=5;
s1=p1.numero1;

Compiladores

272

Grupo 98

C# Compiler

p1.numero1 = value;

}
class clase2{
short s1;
prueba p1;
public static void prueba2(){
}

s1=p1.numero1;

// Debe dar error y con razon!!!!

Lnea de comandos
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba6.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba6.cs", Line 22: Semantic Error: #119: value is not
in atribute
"..\pruebas\prueba6.cs", Line 22: Sintactic Error: #9: 'SentMet' not
valid
"..\pruebas\prueba6.cs", Line 22: Sintactic Error: #3: token '}'
expected
Generador de Codigo: ERROR: Metodo Main no encontrado

10.24 Prueba 24
Esta prueba, algo mas compleja, nos comprueba que efectivamente, cada objeto
instanciado de una clase, si sus variables no estan inicializadas, en dicho objeto tampoco
lo estaran. Por lo que, si se utilizan en una asignacin, el compilador generar un error.
prueba7.cs
class prueba {
public short numero1;
public short metodo1() {
console.write("Estoy en Metodo1\n");
return numero1;
}

class clase{
short s1;
prueba p1;

Compiladores

273

Grupo 98

C# Compiler

public static void Main(){


p1.numero1=5;
s1=p1.numero1;
}

class clase2{
short s1;
prueba p1;
public static void prueba2(){
s1=p1.numero1;
}

// Debe dar error y con razon!!!!

Lnea de comandos
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba7.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba7.cs", Line 31: Semantic Error: #131: var no
inicializated
"..\pruebas\prueba7.cs", Line 31: Sintactic Error: #9: 'SentMet' not
valid
"..\pruebas\prueba7.cs", Line 31: Sintactic Error: #3: token '}'
expected
Generador de Codigo: ERROR: Metodo Main no encontrado

10.25 Prueba 25
Esta prueba se encarga de demostrar que el compilador revisa cada elemento asignado a
una variable lista, verificando si todos los elementos son del mismo tipo que la propia
variable lista. En este caso, intentamos insertar hola en una lista de shorts.
prueba8.cs
class clase{
short [] w = new short [5];
public static void Main(){
short numero1;
short [] v = new short [10];
v[4]=3;
v = {5,"hola"};
numero1=v[4];

Compiladores

274

Grupo 98

C# Compiler

w[2]=v[4]; //da error sintactico que no deberia


w[2]=numero1; //da error sintactico que no deberia
w[2]=6; //da error sintactico que no deberia
Console.Write("Resultados: v[4]={0},
numero1={1}\n",v[4],numero1);
}
}

Lnea de comandos
Mostrar Debug Sintactico Desactivado
Generador de Codigo Intermedio Activado
Generador de Codigo Objeto Activado
Fichero Fuente: ..\pruebas\prueba8.cs
Fichero Salida: salida
Compilando...
"..\pruebas\prueba8.cs", Line 13: Semantic Error: #118: differents
types of list
"..\pruebas\prueba8.cs", Line 13: Sintactic Error: #9: 'SentMet' not
valid
"..\pruebas\prueba8.cs", Line 13: Sintactic Error: #3: token '}'
expected
Generador de Codigo: ERROR: Metodo Main no encontrado

Compiladores

275

Grupo 98

C# Compiler

11 Anexo
Caractersticas Implementadas en el Generador de cdigo:

Variables enteras y su declaracin en clases y mtodos.


Inicializacin de variables enteras durante su declaracin en mtodos pero no en
clases.
Constantes enteras y cadenas de caracteres (entre comillas).
Definicin de clases, con atributos, propiedades y mtodos.
Sentencias: asignaciones, llamadas a mtodos y retorno de los mtodos. Los
mtodos slo pueden retornar void o short. Y solo pueden recibir como
parmetros tipo short que se pasan por valor.
Comentarios
Operaciones de entrada/salida por terminal: Console.Write y Conlole.Read.
No est implementado Console.ReadLine puesto que no estn implementadas
las variables String
Operadores Aritmticos: +, -. No estn implementados: *, /, %
Operadores Relacionales: >, <, >=, <=, ==, !=
Operadores Lgicos: ||. No estn implementados: &&, !
Vectores de Short. No est implementada la inicializacin de los vectores
durante su declaracin, es decir short [] v = {2,3,4}.
Paso de Argumentos por Valor. No esta implementado el paso de parmetros por
Referencia.
Sentencia condicional if-else. No estn implementadas las sentencias while,
do-while, for ni switch-case.
Asignacin con Operacin +=, -=. No estn implementados el resto de
operadores especiales

Compiladores

276

Grupo 98

C# Compiler

12 Bibliografa

Apuntes de Compiladores, Grupo 41M, Cuarto Curso. Facultad de Informtica


Universidad Politcnica de Madrid

Compiladores: Principios, tcnicas y herramientas


Alfred V. Aho, Ravi SEIT & Jeffrey D. Ullman
Addison Wesley Longman (Pearson)

The Compiler Generator Coco/R: User Manual


Hanspeter Mssenbck
Johannes Kepler University Linz
Institute of System Software
February 2004

M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator

Compiladores

277

You might also like