сдвинуть влево один раз и получить перенос формы значения

#c #assembly #microcontroller

#c #сборка #микроконтроллер

Вопрос:

Я использую microchip версии 8.63 с компилятором C.

В следующем фрагменте кода я хочу «сдвинуть один раз значение 1206420333240d», я знаю, что в регистр переноса входит 1 бит. Но я не знаю, как получить эти значения на языке ассемблера для pic18F4550. Мой вопрос в том, как я могу сдвинуть один раз с помощью ассемблера для pic 18F4550 и получить значение из переноса?

В него включен весь проект.

 unsigned int rood = 1206420333240;


void main (void)
{   
    //int rood[] = {0,0,1,0,1,0,1,0,1,0,1,1,1,0,0,0,0,1,1,0,1,0,1,0,1,0,0,0,1,1,0,1,1,1,0,1,0,1,0,1,0,0,0,1,1};

    TRISD = 0x00;               // PORTD  als output
    TRISB = 0b00110000;         // RB4 en RB5 als input
    TRISA = 0x00;               // RA output

    RCONbits.IPEN = 0;          // prioriteit disable
    INTCONbits.GIE = 1;         // enable interrupt
    INTCONbits.RBIE = 1;        // interrupt portB on

    while(1)
    {   
        _asm sleep _endasm  
    }
}

#pragma interrupt ISR
void ISR (void)
{


    if (INTCONbits.RBIF==1)
    {
        if(PORTBbits.RB5==0)        // S3 pressed ?
        {
            int i = 0;
            int b;
            do {
                // Try to shift left (SHF) and get value in carry.
                _asm
                    mov  EAX, 1206420333240d
                _endasm
                //LATAbits.LATA2 = rood << 1;
                //LATDbits.LATD1 ^= 1;

                //do-while for the frequentie (1500 is de freq)
                b = 0;
                do {
                    b  ;
                }while(b <= 2000);

                i  ;
            }while(sizeof(rood) <= 50);

            //LATDbits.LATD1 ^= 1;      // D2 togglen

        }

    }   
    INTCONbits.RBIF = 0;
}
  

Ответ №1:

При использовании сборки на РИС. 18 существует единственная команда, которая повернет значение влево и сохранит бит переноса в назначенном регистре.

 RLCF REG, 0, 0
  

(смотрите страницу 243 в приведенном выше документе по ссылке). ПРИМЕЧАНИЕ: вам пришлось бы запросить регистр переноса, чтобы извлечь значение, и, возможно, установить младший значащий бит равным ‘0’, чтобы противодействовать операции поворота и превратить ее в операцию сдвига.

Вы могли бы прибегнуть к встроенной сборке для выполнения этого, однако мне интересно, почему следующее не сработает:

 int carry = (value amp; 0X80) >> 7; // substitute the correct bit masks here
value = value << 1;

if( carry == 1 )
{
    // Perform action
}
  

Комментарии:

1. На практике это может не сработать, потому что все компиляторы PIC C, которые я использовал, — полное дерьмо.

2. Я доверяю вашему суждению… Я свободно признаю, что единственная разработка PIC18, которую я сделал, выполнена на ассемблере, поэтому я не совсем уверен, насколько хорошо c может здесь работать.