4 votos

Código de ensamblaje PIC simplificado

Necesito convertir el siguiente código de ensamblador PIC (abajo) a ensamblador 8051. Es un código de ensamblador en línea. En realidad, tengo la intención de convertirlo a C. No estoy familiarizado con el PIC MCU, por lo que no entiendo mucho de lo que sucede. Si puedo entender cada instrucción, intentaré ingresar el ensamblador equivalente. O mejor aún, apreciaría si pudiera obtener un código de ensamblador 8051 equivalente. "toRotate" es una variable de 32 bits. Gracias

    _asm
    movlb toRotate
    bcf STATUS,0,0
    btfsc toRotate+3,7,1
    bsf STATUS,0,0
    rlcf toRotate+0,1,1
    rlcf toRotate+1,1,1
    rlcf toRotate+2,1,1
    rlcf toRotate+3,1,1
    _endasm

Este es el código completo abajo.....Realmente quiero saber qué se hace aquí. Mi intención es convertirlo a lenguaje C.

DWORD leftRotateDWORD(DWORD val, BYTE bits)
{
    BYTE i, t;
    DWORD_VAL toRotate;
    toRotate.Val = val;

    for(i = bits; i >= 8u; i -= 8)
    {
        t = toRotate.v[3];
        toRotate.v[3] = toRotate.v[2];
        toRotate.v[2] = toRotate.v[1];
        toRotate.v[1] = toRotate.v[0];
        toRotate.v[0] = t;
    }

    for(; i != 0u; i--)
    {
        _asm
        movlb toRotate
        bcf STATUS,0,0
        btfsc toRotate+3,7,1
        bsf STATUS,0,0
        rlcf toRotate+0,1,1
        rlcf toRotate+1,1,1
        rlcf toRotate+2,1,1
        rlcf toRotate+3,1,1
        _endasm

    }
    return toRotate.Val;
}

3voto

RelaXNow Puntos 1164

Su fragmento de código es para un PIC 18. Es una rutina escrita de forma ingenua para rotar la variable de 32 bits toRotate a la izquierda un bit. Aquí está el código con algunas anotaciones:

         movlb   toRotate    ;establece el banco para acceder a la variable objetivo
         bcf     STATUS, C   ;inicializa el bit para desplazar en 0
         btfsc   toRotate+3, 7 ;¿el bit a desplazar realmente es 0?
         bsf     STATUS, C   ;no, establecerlo en 1
         rlcf    toRotate+0, 1 ;realizar el desplazamiento a la izquierda por un bit
         rlcf    toRotate+1, 1
         rlcf    toRotate+2, 1
         rlcf    toRotate+3, 1

2voto

Jeremy Ruten Puntos 59989

Como dijo Olin Lathrop, es un giro a la izquierda de 32 bits.

Muchos compiladores (a) reconocen este lenguaje como un "girar de 32 bits":

DWORD leftRotateDWORD(DWORD x, BYTE shift){
    y = (x << shift) | (x >> (32 - shift));
}

Estos compiladores emitirán una sola instrucción de giro de 32 bits en procesadores que tengan tal instrucción, o una secuencia altamente optimizada en otros procesadores.

Puede ahorrar mucho tiempo en pruebas y depuración usando una de las implementaciones de los algoritmos propuestos SHA256 o SHA-3 disponibles gratuitamente: ( a b c d e )

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X