|
Несимметрия конечного результата vinavr компилятора |
|
|
|
Nov 16 2012, 21:46
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Всем привет. Такой вопрос. Почему код Код while(pph!=&ph[8]) { *(pph++)=~(*(pph-4)); }, в котором берётся часть массива, инвертируется и записывается в другое место, компилируется в такой несимметричный код? Код while(pph!=&ph[8]) { *(pph++)=~(*(pph-4)); 94: fd 01 movw r30, r26 96: 34 97 sbiw r30, 0x04; 4 98: 80 81 ld r24, Z 9a: 80 95 com r24 9c: 8c 93 st X, r24 9e: 80 91 71 00 lds r24, 0x0071 a2: 80 95 com r24 a4: 11 96 adiw r26, 0x01; 1 a6: 8c 93 st X, r24 a8: 11 97 sbiw r26, 0x01; 1 aa: 90 91 72 00 lds r25, 0x0072 ae: 89 2f mov r24, r25 b0: 80 95 com r24 b2: 12 96 adiw r26, 0x02; 2 b4: 8c 93 st X, r24 b6: 12 97 sbiw r26, 0x02; 2 b8: 80 91 73 00 lds r24, 0x0073 bc: 80 95 com r24 be: 13 96 adiw r26, 0x03; 3 c0: 8c 93 st X, r24 } Казалось бы чего проще, для всех 4-х байт сделать одно и тоже действие: загрузить байт в регистр, а лучше бы воспользоваться регистровой парой Z, инвертировать и записать в новое место, указываемое парой Х. Дальше, почему бы не использовать постинкремент Х+ вместо двух команд adiw и st? Может, кто-то знает, как переделать си-код в нечто подобное?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
 |
Ответов
|
Nov 16 2012, 23:19
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
-Os, gcc 4.7.2 Код 000066a2 <testfn>: 66a2: e2 e9 ldi r30, 0x92 ; 146 66a4: f3 e0 ldi r31, 0x03 ; 3 66a6: df 01 movw r26, r30 66a8: 14 97 sbiw r26, 0x04 ; 4 66aa: 8c 91 ld r24, X 66ac: 80 95 com r24 66ae: 81 93 st Z+, r24 66b0: 83 e0 ldi r24, 0x03 ; 3 66b2: ea 39 cpi r30, 0x9A ; 154 66b4: f8 07 cpc r31, r24 66b6: b9 f7 brne .-18 ; 0x66a6 <testfn+0x4> 66b8: 08 95 ret Код static unsigned char ph [8]; void __attribute__ ((used)) testfn(void) { unsigned char * pph = ph; while(pph!=&ph[8]) { *(pph++)=~(*(pph-4)); }; } Цитата vinavr компилятора Отвечая на Ваш вопрос... Меня давно удивляла неоптимальность применявшихся конструкций в winavr. В этом году, к счастью, появились компиляторы из более новых версий gcc. winavr (проект с таким именем на соурсфоргеекс) последний рз обновлялся тогда, когда такие оптимизайии для avr не делались - потому для вашей задачи как переделать си-код в нечто подобное используйте компилятор поновее.
Сообщение отредактировал Genadi Zawidowski - Nov 16 2012, 23:26
|
|
|
|
Сообщений в этой теме
=GM= Несимметрия конечного результата vinavr компилятора Nov 16 2012, 21:46 zombi Писать на CИ и надеятся что какие то "дяди... Nov 16 2012, 23:44 С_Ч Цитата(zombi @ Nov 17 2012, 02:44) Писать... Nov 17 2012, 06:57  =GM= Да, слова золотые, целиком и полностью поддерживаю... Nov 17 2012, 07:30 _Pasha Текст, взятый у Геннадия, дает
CODEstatic unsigned... Nov 17 2012, 06:14 _Pasha Возьмите Клёновскую сборку, не обязательно крайнюю... Nov 17 2012, 07:57 ReAl Цитата(_Pasha @ Nov 17 2012, 09:57) Возьм... Nov 17 2012, 09:02  demiurg_spb Цитата(ReAl @ Nov 17 2012, 13:02) Или её,... Nov 17 2012, 12:47 polyname ЦитатаНа ассемблере писать!не, лучше прямо в б... Nov 17 2012, 12:31 С_Ч Цитата(polyname @ Nov 17 2012, 15:31) не,... Nov 17 2012, 13:27  =GM= Это я всё могу сделать на асме и сделаю, здесь про... Nov 17 2012, 15:28   _Pasha Цитата(=GM= @ Nov 17 2012, 18:28) Ну, над... Nov 17 2012, 15:43   Сергей Борщ QUOTE (=GM= @ Nov 17 2012, 17:28) могу сд... Nov 17 2012, 17:42    =GM= Борщ, уймитесь. Мне этот топик был полезен, уже ск... Nov 17 2012, 19:42 ILYAUL Код*(pph++)=~(*(pph-4));
... Nov 17 2012, 12:51 ILYAUL ЦитатаА то я чего-то отстал от жизни. нет , прост... Nov 17 2012, 14:11 ReAl А нельзя ли уточнить, какая именно версия avr-gcc/... Nov 17 2012, 20:37 =GM= WinAVR-20100110 (AVR-Studio, vers.4.18, build 684,... Nov 17 2012, 21:58 ReAl Да студия по барабану, если ключ оптимизации извес... Nov 18 2012, 09:35 Petka Цитата(ReAl @ Nov 18 2012, 13:35) ....
Во... Nov 18 2012, 10:33 demiurg_spb Мне вообще представленная ТС строка не нравитсяЦит... Nov 19 2012, 06:52 Сергей Борщ QUOTE (demiurg_spb @ Nov 19 2012, 08:52) ... Nov 20 2012, 07:35  demiurg_spb Цитата(Сергей Борщ @ Nov 20 2012, 11:35) ... Nov 20 2012, 07:40   Сергей Борщ QUOTE (demiurg_spb @ Nov 20 2012, 09:40) ... Nov 20 2012, 10:25    demiurg_spb Цитата(Сергей Борщ @ Nov 20 2012, 14:25) ... Nov 20 2012, 12:39 =GM= Цитата(demiurg_spb @ Nov 19 2012, 06:52) ... Nov 20 2012, 15:37  _Pasha Цитата(=GM= @ Nov 20 2012, 19:37) Умереть... Nov 20 2012, 16:31  ReAl Цитата(=GM= @ Nov 20 2012, 17:37) И снача... Nov 20 2012, 20:51   =GM= Не понимаю разницы, оба варианта псевдокода привед... Nov 21 2012, 07:22    HHIMERA 2 =GM=
А вопрос применения МК с хадварной поддержк... Nov 21 2012, 20:44     =GM= Цитата(HHIMERA @ Nov 21 2012, 20:44) 2 =G... Nov 22 2012, 04:15      HHIMERA Цитата(=GM= @ Nov 22 2012, 08:15) Не знаю... Nov 22 2012, 05:38      ReAl Цитата(=GM= @ Nov 22 2012, 06:15) Извинит... Nov 22 2012, 06:58       demiurg_spb В продолжение темы:КодPORTA=PORTB=PORTC=0;может бы... Nov 22 2012, 09:38       ReAl Цитата(ReAl @ Nov 22 2012, 08:58) но поря... Nov 22 2012, 20:01    ReAl Цитата(=GM= @ Nov 21 2012, 09:22) Эта стр... Nov 21 2012, 21:32 Genadi Zawidowski Цитатапонять что произойдёт тут и вспоминать точки... Nov 20 2012, 01:29
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|