Hola a todos
Estoy trabajando hace unas semanas en una JVM ( maquina virtual de java ) para dspic. La idea es poder utiliar un lenguaje orientado a objetos para nuestras aplicaciones con dsPIC.
Todos hemos oido alguna vez eso de que el java es un lenguaje interpretado y que necesita de una JVM para funcionar. Cuando escribimos un programa en Java y lo compilamos el compilador genera el .class, un archivo que contiene el programa en codigo ensamblador y alguna informacion mas para depurar el programa ( nombres de variables, posiciones del PC donde podemos poner breakpoints...). El codigo ensamblador que se genera no es compatible con el juego de instrucciones de nuestro PC o nuestro PIC, y es JVM la que se encarga de leer cada instruccion y ejecutar las instrucciones correspondientes.
El programa ya funciona y se puede usar para probar programas java con muchas limitaciones, pero ya iremos haciendolo cada vez mas y mas funcional...
La info mas interesante la podeis encontrar en:
picoJava-II Programmers Reference manual (
http://www.sun.com/software/communitysource/processors/download_picojava.xml )
http://www.hio.hen.nl/~vanleeuw/pse/vmspec.pdfUn programa muy util para decodificar los .class
www.classfileinspector.comEste es un ejemplo xa comprobar la de la JVM.
//javacode.txt
package javaapplication3;
public class Main {
public static void main(String[] args) {
// Test variable declaration
long i = 0, j = 0;
// Test variable operations
i = 10;
j = i + 2;
j = i * 2;
j = i / 2;
// Test bucle for
for (i = 0, j = 0; i < 3; i++) {
j = i * 3;
}
// Test bucle while
j = 8;
while (i != 0) {
j /= 2;
i--;
}
// Test bucle do-while
j = 0;
do {
i++;
j += i;
} while (i < 3);
for (i = 0; i < 10; i++) {
// Test if-else if-else sentence
if (i == 0) {
j = 0;
} else if (i == 1) {
j = 5;
} else if (i == 2) {
j = 10;
} else if (i == 3) {
j = 15;
} else if (i == 4) {
j = 20;
} else {
// Test switch sentence
switch ((int)i) {
case 5:
j = 25;
break;
case 6:
j = 30;
break;
case 7:
j = 35;
break;
case 8:
j = 40;
break;
default:
j = 45;
break;
}
}
}
}
}
Os adjunto el codigo del proyecto, si quereis probar como funciona, poner un breakpoint en la linea 391 del picJava-II.c
case lstore_0 : /*0x3f lstore_0*/
case lstore_1 : /*0x40 lstore_1*/
case lstore_2 : /*0x41 lstore_2*/
case lstore_3 : /*0x42 lstore_3*/
n = mem[PC] - lstore_0;
//long_64( stack[32-(VARS - n)] ) = long_64( stack[32-(OPTOP - 2)] );// ERROR at picoJava-II.pdf or VMspec.pdf
long_64( stack[32-(VARS - n)] ) = long_64( stack[32-(OPTOP + 2)] ); //Corrected code, similar to dstore_n
>>BREAKPOINT>>>>OPTOP += 2;
PC++;
break;
y correr el programa. Visualizar el array stack[] entero y podreis ir viendo como van apareciendo los valores 10, 12, 20, 5 en un elemento del stack[](que corresponderia a la variable j)...
Si quereis compilar un nuevo programa, utilizar el netbeans para generar el .class, convertir el .class a HEX e introducirlo como datos en mem[] (opcodes.h).
Espero que os guste...saludos