== Métodos ==
*Prototipo Igual que Java
* El cuerpo (Dec_Variable | [Etiqueta:] Instruccion)* (ClausulaCatch)*
int m1(int a){
…
}
– Declaración de Variables igual que en java
– Declaración de Variables deben declararse antes de su uso.
– Los parametros se tratan igual que las variables.
– Instrucciones son ByteCode o macros.
* Clausula Catch para capturar/manipular excepciones
catch [NombreClase] (EtiquetaIni, EtiquetaFin)
EtiquetaMan
– NombreClase : Tipo de excepción, si no se especifica captura java.lang.throwables.
– EtiquetaMan: Comienzo del bloque de manipulación.
– EtiquetaIni, EtiquetaFin:Comienzo y fin del bloque de captura.
== Instrucciones ==
=== Notación de Instrucciones ===
(PilaAntes => PilaDespues)
Cargar -> Apila en la cima de la pila
Almacenar -> Extrae un elemento de la cima.
=== Carga de Constantes ===
*aconst_null: carga la referencia ( … => …,null)
*bipush: carga entero byte ( … => …,numero)
*iconst_m1: carga entero -1 ( … => …,-1)
*sipush numero: carga entero short ( … => …,numero)
*lconst_0|1: carga long 0|1 ( … => …,0)|( … => …,1)
*fconst_0|1|2: carga float 0|1|2 ( … => …,0.0)|( … => …,1.0)|( … => …,2.0)
*dconst_0|1: carga double 0|1 ( … => …,0)|( … => …,1)
*ldc valor: carga valor en la cima
ldc 3 //iconst_3
ldc 12983 //int
ldc 5.5 //double
ldc (float)5.5//float
=== Accesos a variables y parámetros ===
* load variable : (… => …,variable)
* store variable : (…,valor => …)
var = par;
iload par (… => …,par)
istore var (…,par => …)
aload_0
aload this //carga una referencia al objeto actual (…=>…,this)
=== Operaciones con Arrays ===
*aload: carga una referencia en un array. (…,refArray,indice => …,refArray[indice])
*astore: carga un valor de un array (…,refArray,indice,valor => …)
*arraylength -> carga el nº de compònentes de un array (…, refArray => …,numComponentes)
int iarr[4];
iarr[3] = iarr[1];
aload iarr //(…=>…,iarr)
iconst_3 // (…iarr=>…iarr,3)
aload iarr // (…iarr,3=>…iarr,3,iarr)
iconst_1 // (…iarr,3,iarr=>…iarr,3,iarr,1)
iaload //(…iarr,3,iarr,1=>…iarr,3,iarr[1])
iastore // (…iarr,3,iarr[1]=>…)
int a[3][3];
a[2][3];
aload a // (…=>…,a)
iconst 2 // (..,a=>…,a,2)
aaload // (…,a,2=>…,a[2])
iconst 3 // (…,a[2]=>…,a[2],3)
iaload // (…,a[2],3=>…,a[2][3])
=== Acceso a Atributos ===
====Atributo no estático====
Necesita tener cargada la referencia a los objetos
*getfield nombreAtributo tipoAtributo: (…,refObjeto=>…,valorAtributo)
*putfield nombreAtributo tipoAtributo: Almacena el valor de un atributo (…,refObjeto,valor=>…)
====Atributo estático. ====
*getstatic NombreClase.nombreAtributo tipoAtributo:
Carga un atributo estático NombreClase.atributo(…=>…,valorAtributo)
*putstatic NombreClase.nombreAtributo tipoAtributo:
Almacena un valor en un atributo estático (…,valor => …)
ClaseNoInstanciable.atr1 = Objeto1.atr2;
aload Objeto1 // (…=>…,Objeto1)
getfield atr2 int // (…,Objeto1=> …,Objeto1.atr2)
aload ClaseNoInstanciable
putstatic ClaseNoInstanciable.atr1 int // (…,Objeto1.atr2=>…)
=== Instrucciones de tipos de datos ===
====Tipos de Datos ====
*d : double
*l : long
*i : int
*a : ref
====Conversion de tipos numericos====
* De entero a: (long,float,byte,short)
i2l i2f i2b i2s
* De long a : (int,floar,double)
l2i l2f l2d
* De float a : (int,long,double)
f2i f2l f2d
* De dobule a: (int,long,float)
d2i d2l d2f
====Comprobar tipos====
*instaceof nombreClase
(…,refObjeto=> …,0) Si objeto No pertenece a una Clase
(…,refObjeto=> …,1) Si objeto Si pertenece a una Clase
=== Creación de Objetos ===
*new nombreClase :
Crea un objeto en el monton y apila una refencia aél.
(…=>…,refObjeto)
A a;
a = crear(A);
new A // (…=>…,A)
astore a // (…,A=> …)
=== Creación de Arrays Unidimensionales ===
*newarray tipoPrimitivo :
crea un array del tipoPrimitivo en el montón y apila una referencia.
(…,numElementos => …,refArray)
*anewarray nombreClase :
crea un array de objetos en el monton y apila una referencia.
(…,numComponentes=>…,refArray)
int a[9];
bipush 9 // (…=>…,9)
newarray int //(…,9=>…,refArray)
astore a // (…,refArray=> …)
String S[8];
bipush 8 // (…=>…,8)
anewarray String // (…,8=>…,refArray)
astore S // (…,refArray=> …)
=== Creacion de Arrays Multidimensionales ===
*multyarray tipo_datos([])+ nº dimensiones: (…,Componente1,Componente2,…=>…,refArray)
byte b[10][8];
bipush 10 // (…=>…,10)
bipus 8 // (…,10 => …,10,8)
multinewarray byte[][] 2 (…,10,8=>…,refArray)
astore b // (…,refArray=>…)
=== Instrucciones Aritmeticas Logicas ===
==== Aritmeticas ====
*add (…,op1,op2 => …,op1+op2)
*sub (…,op1,op2 => …,op1-op2)
*mul (…,op1,op2 => …,op1*op2)
*div (…,op1,op2 => …,op1/op2)
*neg (…,op1 => …,-op1)
==== Logicas====
*and (…,op1,op2 => op1&&op2)
*or (…,op1,op2 => op1||op2)
*xor (…,op1,op2 => op1xorop2)
==== Incremento====
*iinc variable incremento
iinc a 3
=== Manipulación de la Pila ===
* pop (…, x => …)
* dup (…,x => …,x,x)
* swap (…,x,y => …,y,x)
=== LLamadas a métodos ===
Antes de la llamada hay que cargar la referencia al objeto y los parametros reales. (…,reObjeto,parReal1,…,parRealN => …,refObjeto,parReal1,…,parRealN,varLocal1,…,varLocalN,)
Al hacer la llamada se cambia de frame activo al frame del método.
*(invokevirtual | invokespecial | invokestatic) [NombreClase.]nombreMetodo Signatura
** (invokevirtual | invokespecial | invokestatic) : metodo no estático | super clase o constructor | metodo estático.
** Signature : ([TipoDato(, TipoDato)*])TipoDato, rango y dominio.
invokevirtual elemento.modificar(int) void //cambia el frame activo
invokespecial super() void
a.m(3*a);
aload a // (…=>…,this)
iconst_3 // (…,this => …,this,3)
iload a // (…,this,3 => …,this,3,a)
imul // (…,this,3,a => …,this,a*3)
invokevirtual m(int) void (…,this,3*a => …,this,3*a,VARIABLES LOCALES)
=== Instrucciones de saltos Incondicionales ===
*goto etiqueta : Salto a la etiqueta.
*return : vuelta de procecimiento.
*return : vuelta a la fncion. Pero dejo en la cima el resultado.
*jsr etiqueta : salto subrutina dentro de un metodo.
*ret : vuelta de una subrutina.
=== Instrucciones de salto Condicionales ===
==== Salto Condicional ====
*if_icmp etiqueta (…,-1|0|1 => …)
** -1|0|1 : menor | igual | mayor
**: eq | ge | neg | le | ll | gt
si (a <=3) entonces{
...
}
//suponemos que a<=3 ya se ha resuelto
if_icmgt etiqueta1
...
etiqueta1:
==== Comparación de Objetos y Saltos ====
* if_acmpeq etiqueta (...,refObj1,refObj2 => …)
* if_acmpne etiqueta (…,refObj1,refObj2 => …)
* if_null etiqueta (…,refObj1 => …)
* if_nonull etiqueta (…,refObj1 => …)
==== Comparación de Long, Float y Double ====
*lcomp (…,op1,op2 => …,-1|0|1)
*fcomp (…,op1,op2 => …,-1|0|1)
*dcomp (…,op1,op2 => …,-1|0|1)
== Macros ==
===print ===
*(%print|%println) [out|err] [par(, par)*]
** par: cualquier cosa que vayamos a escribir
%println a,” “,3
%load Par // (… => …, par)
%load a // (…,par => …,par,a) no me preocupa lo que sea, yo solo lo cargo
%load 3 // (…,par.,a => …,par.,a,3)
===set===
* %set Par = Par
a = 3;
%set a = 3
%set a = 3 * b //ERROR!!!!
===object===
Se usa para CREAR objetos, invoca al contructor y devuelve una referencia al objeto creado.
* %object NombreClase (… => …,refObjeto)
===arrays===
* array [NombreClase | TipoPredefinidoSimple] ([CteEntera])+ (… => …,refArray)
%array int[3][4]
*array_iterate NombreArray VarIndice %end_iterate
int[] arr;
int indx;
%array int [4]
astore arr
%array_iterate arr idx
%println “arr[",indx,"]=”,arr[idx]
%end_iterate