реклама на сайте
подробности

 
 
> Странное поведение компилятора AVRGCC в простой ситуации
Олег.
сообщение Mar 28 2009, 13:54
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 29-12-04
Пользователь №: 1 738



Добрый всем вечер.

Столкнулся со странным поведением компилятора в простой ситуации. Имеется простой код:

volatile char data;

int main(void){
if((data & 3) == 0)
data++;

return(0);
}

после компиляции имеем листинг:

volatile char data;

int main(void){
if((data & 3) == 0)
5e: 80 91 60 00 lds r24, 0x0060
62: 90 e0 ldi r25, 0x00 ; 0
64: 83 70 andi r24, 0x03 ; 3
66: 90 70 andi r25, 0x00 ; 0
68: 89 2b or r24, r25
6a: 29 f4 brne .+10 ; 0x76 <main+0x18>
data++;
6c: 80 91 60 00 lds r24, 0x0060
70: 8f 5f subi r24, 0xFF ; 255
72: 80 93 60 00 sts 0x0060, r24

return(0);
}
76: 80 e0 ldi r24, 0x00 ; 0
78: 90 e0 ldi r25, 0x00 ; 0
7a: 08 95 ret

видно, что в данном случае константу компилятор интерпретирует как 16 битную и никакие приведения типа не помогают.
Однако если изменить константу на значение 9, то всё нормально, вот листинг :

volatile char data;

int main(void){
if((data & 9) == 0)
5e: 80 91 60 00 lds r24, 0x0060
62: 89 70 andi r24, 0x09 ; 9
64: 29 f4 brne .+10 ; 0x70 <main+0x12>
data++;
66: 80 91 60 00 lds r24, 0x0060
6a: 8f 5f subi r24, 0xFF ; 255
6c: 80 93 60 00 sts 0x0060, r24

return(0);
}
70: 80 e0 ldi r24, 0x00 ; 0
72: 90 e0 ldi r25, 0x00 ; 0
74: 08 95 ret

при константе равной 15 опять воспринимает как 16 битное. Путём подбора констант заметил, что до 8 включительно воспринимает как 16 битное, затем с 9 как 8 битное. То есть какая то зависимость от значения.
Вопрос . Кто нибудь сталкивался с подобным? Может это ошибка в компиляторе хотя она не очень значительная, ведь с точки зрения
кода всё правильно, только имеют место ненужные команды. В слуае критичности по размеру кода и количеству таких ситуаций несколько увеличивается размер кода.
Спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016