Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   JAVA (https://www.clubdelphi.com/foros/forumdisplay.php?f=16)
-   -   ASSEMBLER en JAVA (https://www.clubdelphi.com/foros/showthread.php?t=60882)

Enan0 17-10-2008 00:37:48

ASSEMBLER en JAVA
 
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..

Código Delphi [-]

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/20...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:

Código:

  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
Código Delphi [-]
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

Código Delphi [-]
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

Cita:

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

Cita:

Empezado por Enan0 (Mensaje 320912)
...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:

Código:

  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.

Cita:

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


Código Delphi [-]
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

Código:

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

Saludos

Enan0 21-10-2008 00:26:33

Usando este codigo!!!
Código Delphi [-]
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;

Código:

  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.

Cita:

non-static method ROL2(int) cannot be referenced from a static context
asique la Redeclare.

Y bueno he aqui el codigo!!
Código Delphi [-]
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);
        
    }
    }
    
    
}

Cita:

Empezado por Resultado

77
53
212
83
77
53
212
83

Una vez mas un millon de Gracias!


La franja horaria es GMT +2. Ahora son las 16:10:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi