Rotar Bits ( ROL ROR )

Iniciado por TrashAmbishion, 1 Diciembre 2013, 19:21 PM

0 Miembros y 1 Visitante están viendo este tema.

TrashAmbishion

Amigos alguien sabe como puedo emplear estas 2 funciones de ASM en .Net

Código (vbnet) [Seleccionar]


Public Shared Function RotateLeftByVal(value As UInteger, ByVal count As UInteger)
        Return (value << count) Or (value >> (32 - count))
    End Function

    Public Shared Function RotateRightByVal(ByVal value As UInteger, ByVal count As UInteger)
        Return (value >> count) Or (value << (32 - count))
    End Function



Tengo estas 2 funciones pero creo que no funcionan correctamente.. alguien que me pueda ayudar...

Thx

Eleкtro

#1
Para los que no sabemos ASM, ¿puedes mostrar el uso de las funciones originales (en ASM) y/o indicar que resultado esperas conseguir al llamar a cada función para poder darte una solución?

Saludos









El Benjo

Quizá no te esté funcionando porque (según sé) en ASM las instrucciones ROR Y ROL regresan los bits desplazados nuevamente a la posición contraria de la variable y en .NET esos bits se descartan. Ejemplo al desplazar 2 bits:





ASMVB.NET
Bits originales: 11000011Bits originales: 11000011
Bits después del desplazamiento: 00001111Bits después del desplazamiento: 00000000
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

TrashAmbishion

Hola Benjo,

Eso lo tengo claro el operador que hace esto es >> y el << que en ASM es SHL y SHR, los que digo yo hacen la rotacion circular (Shift Circular Rotation) encontre una funcion en un proyecto que despues podre pero con algunos funciona y con otros no...

De madre, estoy a punto de dejarlo y esperar...

Salu2 y GRacias

El Benjo

#5
Para simular las funciones de rotación circulas la tienes realmente fácil y sólo necesitas crear una nueva variable para ello:

Código (vbnet) [Seleccionar]

  Public Shared Function RotateLeftByVal(value As UInteger, ByVal count As UInteger)
       Dim VT as UInteger
       VT = value
       VT >> (32 - count)
       value << count
       value += VT
       Return value
       'Return (value << count) Or (value >> (32 - count))
   End Function


Faltaría que modificaras la otra función.

El código no ha sido probado, pruébalo y nos dices si te ha servido. Saludos.  ;D
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.