Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > JAVA
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 17-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Hola

Tal vez esta página te ayude de algo.

http://today.java.net/pub/a/today/20...from-java.html

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 17-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 17-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #5  
Antiguo 17-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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..
Responder Con Cita
  #6  
Antiguo 19-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 19-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por Enan0 Ver Mensaje
...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" prueba ésto:

Código:
  private static  byte  ROL2(byte Value)
  {
   return (byte)((Value << 2) | (Value >> 6));
  }
Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx

Última edición por cHackAll fecha: 20-10-2008 a las 17:39:55. Razón: corrijo un valor copiado del post #7
Responder Con Cita
  #8  
Antiguo 19-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 19-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 19-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 20-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Código:
  private static byte ROL2(byte Value)
  {
   return (byte)((Value<<2)|(Value>>6));
  }
Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #12  
Antiguo 21-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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!!
Responder Con Cita
  #13  
Antiguo 21-10-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
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 , 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
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #14  
Antiguo 21-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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
Responder Con Cita
  #15  
Antiguo 21-10-2008
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Boteable en assembler fide API de Windows 5 31-12-2006 20:05:31
Assembler desde delphi lookmydoom Varios 3 30-06-2006 21:56:20
assembler y el señor delphi fcran Varios 2 26-06-2006 11:32:14
Fuentes assembler o .asm Leomedellin Varios 7 19-04-2005 07:09:33
assembler en delphi fcran Varios 4 23-05-2003 07:35:44


La franja horaria es GMT +2. Ahora son las 04:04:22.


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