#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 может здесь работать.