Código de ensamblaje PIC simplificado

3

Necesito convertir el siguiente código de ensamblaje PIC (a continuación) en un ensamblaje 8051. Es un código de ensamblaje en línea. En realidad, tengo la intención de convertirlo a C. No estoy familiarizado con el MCU PIC, por lo que no entiendo mucho de lo que sucede. Si puedo comprender cada instrucción, intentaré ingresar el ensamblaje equivalente. O mejor aún, apreciaré si puedo obtener un código de ensamblaje 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 a continuación ... Realmente quiero saber qué se hace aquí. Mi intención es convertirlo en 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;
}
    
pregunta Paul A.

2 respuestas

3

Su fragmento de código es para un PIC 18. Es una rutina ingenuamente escrita para rotar la variable de 32 bits para Rotar un bit. Aquí está el código con alguna anotación:

         movlb   toRotate    ;set bank for access to target variable
         bcf     STATUS, C   ;init bit to shift in to 0
         btfsc   toRotate+3, 7 ;bit to shift in really is 0 ?
         bsf     STATUS, C   ;no, set it to 1
         rlcf    toRotate+0, 1 ;do the left shift by one bit
         rlcf    toRotate+1, 1
         rlcf    toRotate+2, 1
         rlcf    toRotate+3, 1
    
respondido por el Olin Lathrop
1

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

Muchos compiladores ( a ) reconocen este idioma como una "rotación de 32 bits":

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

Esos compiladores emitirán una única instrucción de rotación de 32 bits en los procesadores que tienen dicha instrucción, o una secuencia altamente optimizada en otros procesadores.

Es posible que ahorre mucho tiempo en pruebas y depuración mediante utilizando una de las implementaciones gratuitas de los algoritmos propuestos por SHA256 o SHA-3: ( a b c d e )

    
respondido por el davidcary

Lea otras preguntas en las etiquetas