PDA

Ver la Versión Completa : ASSEMBLER en JAVA


Enan0
17-10-2008, 00:37:48
Hola Amigos. bueno me encuentro haciendo una transcripcion de una parte de un programa desarrollado en delphi a java.

a los golpes y con mucho trabajo vengo bien. hasta que me he topado con lo siguiente..



function ROL2(B: Byte): Byte;
begin
asm
mov al,b
rol al,2
mov result,al
end;
end;


Este codigo En ASSEMBLER.

El problema es.. es posible y utilizar codigo assember en javA?

If True
Como?

Muchas gracias.

egostar
17-10-2008, 01:13:20
Hola

Tal vez esta página te ayude de algo.

http://today.java.net/pub/a/today/2006/10/19/invoking-assembly-language-from-java.html

Salud OS

Enan0
17-10-2008, 01:31:12
gracias egostar!!, mañana me voy a tomar el trabajo de leerla completita y bien detalladamente porque por una mirada rapida que le di. no entendi un pomo jejeje


saludos y gracias

cHackAll
17-10-2008, 15:25:47
El enlace que te muestra egostar, aconseja utilizar otro lenguaje (MASM) para crear una librería dinamica que contenga las funciones en ASM que requieres y luego exportar dichos métodos en JAVA. Es posible hacer lo mismo con Delphi; creas una DLL pegas la funcion que quieres exportar (ROL2) la defines como stdcall y la exportas. Pero creo que un simple ROL 2 no amerita tanto esfuerzo:

private char ROL2(char Value)
{
return (Value << 2) | (Value >> 6);
}

Saludos

Enan0
17-10-2008, 23:34:51
Hola cHaKall, gracias por la info. de todas maneras. de pura casualidad encontre
Integer.rotateLeft(int i, int dist);



es decir que ya existe la funcion...

gracias de todos modos y perdon por molestar..

Enan0
19-10-2008, 02:36:29
Bueno la funcion anterior que les comente no funciona bien debido a que no completa los 8 bits (es decir no rellena con ceros entonces da un error importante)

cHacKall hice una modificacion a lo que me posteaste

private static byte ROL2(byte Value)
{
return (Value<<2) | (Value >> 8) ;
}

Cambie tel Tipo de dato por Byte. pero de todas maneras sigo teniendo este error

possible loss of precision
found : int
required: byte
return (Value<<2) | (Value >> 8) ;

y tiene una marca en el PIPE o MORE..

sabrias decirme a que se debe?

gracias

cHackAll
19-10-2008, 15:45:08
...sabrias decirme a que se debe?...

Aunque mi definicion no sea la que vayas a leer en un libro te explico con mis palabras lo que sucede; el compilador esta realizando un casting implicito debido a la diferencia en los tipos de datos (entre el resultado de la operacion y el tipo retornado), los cuales varian en 24 bits y dicha diferencia puede representar una perdida de datos y por ende una falla en la presicion del resultado; como para nuestros fines solo nos interesa un ROL de 8 bits y estamos concientes que "no pasa nada" :D prueba ésto:

private static byte ROL2(byte Value)
{
return (byte)((Value << 2) | (Value >> 6));
}

Saludos

Enan0
19-10-2008, 18:30:39
gracias cHacKall. porque la verdad que estoy haciendo mis primeras armas en java. y justamente transcribiendo unas lineas de delphi. bueno hay muchos fundamentos de JAVA que se encuentras ausentes en mi.

gracias de nuevo y te comento como me resulto todo
saludos

Enan0
19-10-2008, 18:38:11
Sigo con el mismo error... por mas que utilize el Typecast.


possible loss of precision
found : int
required: byte
return (byte)(Value<<2) | (Value >> 8) ;
^
1 error


este es el codigo completo



public class rotate {

private static byte ROL2(byte Value)
{
return (byte)(Value<<2) | (Value >> 8) ;
}

public rotate() {
byte n;
Integer i;
n=83;
n=ROL2(n);
System.out.println(n);
for (i=0;i<7;i++)
n=ROL2(n);
System.out.println(n);
}


}


uso el for para verificar que no haya perdida de datos. debido a que el programa original asi lo hace con el ROL del assembler. y se puede decir que siempre da el mismo resultado.. debido a que solo rota los 8 bits.

Utilizando el Integer.rotatetoleft() no funciona bien ya que no completa los 8 bits es decir No rellena con Ceros.

Enan0
19-10-2008, 18:46:18
Bueno ahi pude hacer que compile..
Simplemente haciendo lo que vos dijiste... usando el TypeCast.

me habia comido un par de ( ... )

El tema es el siguiente.

el Rol 83,2 deberia dar 77 y da 76
eso se debe a no completa los 8 Bits.
Si lo hacemos manual seria!

01010011 = 83
01001101 = 77

y como te inmaginaras apartir de ahi todos los calculos dan mal.

cHackAll
20-10-2008, 17:39:10
private static byte ROL2(byte Value)
{
return (byte)((Value<<2)|(Value>>6));
}

Saludos (http://www.clubdelphi.com/foros/showpost.php?p=320749)

Enan0
21-10-2008, 00:26:33
Usando este codigo!!!
function ROL2(B: Byte): Byte;
begin
asm
mov al,b
rol al,2
mov result,al
end;
end;

el Rol Da lo siguiente

ROL 83,2 = 77
ROL 77,2 = 53
ROL 53,2 = 212
ROL 212,2 = 83
ROL 83,2 = 77

como te inmaginas uso el resultado como valor de entrada y los valores se repiten!!

Utilizando el Codigo de java!!
77
53
-44
-1
-1
-1
-1
-1

Como te inmaginaras.. sigo con el mismo problema.. en verdad no los Rota. sino que los Desplaza.
es decir los mueve y rellena con 0

me parece que voy a tener que hacer algo de manera cacera!!

cHackAll
21-10-2008, 16:15:54
Considero que no es necesario el modificador "static" en una función sin variables declaradas, digo esto porque solo un comportamiento "residual" provocaría que una función retorne un valor correcto con un numero X, y que luego de algunas iteraciones al azar retorne un valor incorrecto con el mismo numero de prueba X (me refiero al "83" en tus pruebas).

Aparte de ese problema, he notado que el tipo de datos “byte” en JAVA tiene un rango de 2^7-1 al igual que un ShortInt de Delphi, con lo cual el valor esperado será siempre erróneo cuando sea establecido el último bit de dicho tipo (el signo).

Hagamos otra prueba antes que decida instalar JAVA :rolleyes:, y por favor si realizas alguna modificación a la misma explícame la razón puntualmente;

private int ROL2(int Value)
{
return ((Value << 2) | (Value >> 6)) & 0xFF;
}

Saludos

Enan0
21-10-2008, 21:31:47
Hola cHackAll, mira el cambio que hice lo hice sin saber, TE pido disculpas y voy a probar eso que me pasaste a ver si todo funciona Bien.

y la verdad que mucho no te voy a poder explicar si hago algun cambio, que como dije. es mi primer Pasito en el lindo mundo de java.

saludos y estoy en contacto

Enan0
21-10-2008, 21:37:53
Bueno cHacKall, la verdad que me ayudaste muchisimo, en 2 dias pude solucionar algo que me venia llevando unos cuantos mas..

Te cuento que la funcion quedo de 10, de la siguiente manera.

Antes que nada Volvi a declarar la funcion como STATIC porque sino me daba el siguiente Error.


non-static method ROL2(int) cannot be referenced from a static context


asique la Redeclare.

Y bueno he aqui el codigo!!

public class rotate {

private static int ROL2(int Value)
{
return ((Value<<2)|(Value>>6))& 0xFF ;
}

public static void main (String[] args) {
java.util.BitSet b;

int n;
Integer i;
n=83;

n=ROL2(n);

System.out.println(n);
for (i=0;i<7;i++) {
n=ROL2(n);
System.out.println(n);

}
}


}




77
53
212
83
77
53
212
83


Una vez mas un millon de Gracias!