Отговори на тема  [ 29 мнения ]  Отиди на страница 1, 2  Следваща
оптимизация на асемблерски код 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение оптимизация на асемблерски код
Здравейте.
Преди седмица, 2, реших да понауча асемблер за АВР. Всичко хубаво, но май нещо ми идва доста на нагорнище да превключа от Ц на асемблер.
За целта се хванах да си правя проектче за управление на AD9850 (DDS synthesizer). Използвания контролер е мега8.
Молбата ми е - някой от разбиращите асемблер да метне 1 око и да даде ценни методически указания за оптимизация от към големина на кода, предразполагане за решки и др. подобни .

Код:
.include "m8def.inc"

.def temp = r16
.def i = r17
.def t = r18;
.def reg = r19;

.equ AD_DATA = 5;
.equ AD_CLK = 4;
.equ AD_UP = 3;

// ram
.equ sramData = SRAM_START;  5 bytes
// end of ram
.cseg
.org 0x00
   rjmp main;

data:
.db 35,142, 56,227,  0, 0;  0b00100011, 0b10001110, 0b00111000, 0b11100011, 0b00000000, 1 nula v powe4e


///////////// pgmDDS //////////////////////////////////////////////
pgmDDS:
   ldi i, 5; // shte se pratqt 5 bytes informaciq kym AD9850
   
   ;zarejdane na ukazatelq kym data
   ldi YL, low(sramData)
   ldi YH, high(sramData)

pgmLoop:
   ld temp, Y+; zarejdane sydyrjanieto na Y v temp i uveli4awane na Y ukazatelq s 1
   ldi t, 8; 8 bita shte se izprashtat

pgmBitsRotate:
   ror temp; rotaciq na dqsno, bit-a otiwa c carry flag-a
   in reg, SREG;

   sbrs reg, SREG_C
   cbi PORTC, AD_DATA ; carry flaga e bil 0
   sbrc reg, SREG_C;
   sbi PORTC, AD_DATA ; carry flaga e bil 1

   ; 1 impuls na clock-a na ad9850
   sbi PORTC, AD_CLK;
   nop;
   nop;
   nop;
   cbi PORTC, AD_CLK;

   dec t
   tst t;
   breq pgmBitsLoopEnd;

   rjmp pgmBitsRotate;
pgmBitsLoopEnd:
   
   sbi PORTC, AD_UP;
   nop;
   nop;
   cbi PORTC, AD_UP;

   dec i;
   tst i;   
   breq pgmLoopEnd;

   rjmp pgmLoop;

pgmLoopEnd:
   ret;
//////////////////////////////////////////////////////

main:
   ;stack init
   ldi temp, LOW(RAMEND)
   out SPL, temp;
   ldi temp, HIGH(RAMEND);
   out SPH, temp;
   ;end of stack init

;///////////////////////
   ; PORTC - izhodi
   ldi temp, (1<<AD_UP) | (1<<AD_CLK) | (1<<AD_DATA);
   out DDRC, temp;

; kopirane na 5 bytes ot programnoto prostranstvo v RAM-a
   ldi i, 5;

   ldi ZL, LOW(2*data);
   ldi ZH, HIGH(2*data);

   ldi YL, LOW(sramData);
   ldi YH, HIGH(sramData);
copyLoop:
   lpm; zarejda stojnostta na ukazatelq Z w R0
   adiw Z, 1; Z++

   mov temp, r0; kopirane na R0 w temp
   st Y+, temp; zapametqwane na temp v RAM adresa so4en ot Y. Y++

   dec i;
   tst i;
   breq copyLoopEnd;
   rjmp copyLoop;
copyLoopEnd:

   ;programirane na AD9850
   rcall pgmDDS;

mainLoop:

   ldi YL, LOW(sramData);
   ldi YH, HIGH(sramData);
   
   ld r1, Y+;
   ld r2, Y+;
   ld r3, Y+;
   ld r4, Y
   
   ldi temp, 1; stypka
   
   ; data = data + stypka
   add r4, temp;
   ldi temp, 0;
   adc r3, temp;
   adc r2, temp;
   adc r1, temp;

   ldi YL, LOW(sramData);
   ldi YH, HIGH(sramData);

   st Y+, r1;
   st Y+, r2;
   st Y+, r3;
   st Y,  r4;

   rcall pgmDDS;

   ldi i, 0xFF;

mainDelay:
   ldi temp, 0xFF;

md2:
   dec temp;
   tst temp;
   breq md2end;
   rjmp md2;
md2end:

   dec i;
   tst i;
   breq mainDelayEnd;
   rjmp mainDelay;
mainDelayEnd:
   rjmp mainLoop;

end:
rjmp end;



Сря Дек 16, 2009 11:50 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
имаш ли сериозна нужда от асемблер та си губиш времето с него?


Сря Дек 16, 2009 6:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Ами то по твойта логика, погледнато през моите очи - и с контролерите като цяло си губя времето, понеже се занимавам с тях през свободното си време, не професионално ;)
Конкретна причина да седна да уча асемблер - няма. Просто реших че, докато не изучва из основи мегите, няма да се прехвърля на нещо по голямо. Съответно ми се стори доста лесно изучаването им по подробно, чрез писане на асемблер. Допада ми също че, една и съща програма писана на Ц и на асемблер има различна големина (понякога в пъти) в полза на асемблера. И не на последно място - допада ми работата с контролера на максимално ниско ниво.


Сря Дек 16, 2009 6:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
абе и аз бях като тебе - на максимално ниско ниво да ми харесва да шляпам, ама ще установиш че за нещо по-голямо да пишеш така си е.... извратено. рядко се налага да дописваш на асмблер за повечето контролери, който имат и свястен Ц компилатор за тях, а то повечето са такива, тъй че не е особенно ползотворно занимание. ама за спорта не е лошо :) а ти явно за това го правиш, така че забавлявай се, пък ако от хоби стане професия - тогава ще ти е от полза понякога. тамън ще научиш и Ц-то, щото дявола ще те ръчка към него :P


Сря Дек 16, 2009 6:59 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Дек 19, 2004 6:26 pm
Мнения: 1628
Местоположение: Сливен
Мнение 
md2:
dec temp;
tst temp;
breq md2end;
rjmp md2;
md2end:

Не отчайвайте човека де.......
Асемблерчето си е като първата любов :roll:

md2:
dec temp
brne md2
md2end:
......................

не съм гледал всичко, но това ми се набива в очите
давай смело нататък!
:D


Сря Дек 16, 2009 7:13 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Много хубаво е да се започне с асемблер. Без това никога няма да добиеш представа какво всъщност прави контролера. След време, като пропишеш да C, ще добиеш навика от време на време да поглеждаш компилатора какво реално е направил и оттам да си правиш изводи как по-оптимално да ползваш езика.

Така че, дерзай! =D>


Сря Дек 16, 2009 7:30 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Много си прав @Wise, окъкал съм всички бранчове :)
@head_up, чувам че, сносните компилатори са платени, а аз лично избягвам да ползвам излекувани такива :). Определено гцц-то което идва с WinAVR не генерира компактен код.
@bateAz, точно на обратно почнах - първо Ц, та после асемблер. Ц-то като език не ми е проблем, тъй като на него прописах преди малко повече от 10 години :), но за ПЦ :D
Проблемът ми със Ц идва от не знанието на тънкостите при писане на програми за МЦУ-та(стават тлъсти :) ). Съответно за да се "светна" сам, реших да пробвам асемблера.


Сря Дек 16, 2009 8:22 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
Аз също се занимавам повече като хоби с контролерите отколкото професионално.
Съгласен съм и нееднократно гцц ме е дразнило с генерирания код, но познавам асемблера до степен само да преглеждам кода при проблеми в изпълнението или при неразумни обеми за някоя Ц-конструкция.
Важното е програмата да работи достатъчно стабилно в зададениете й условия. Естествено ако ще се правят някакви оптимизирани фрагменти и С прави само глупости, асемблера няма алтернатива...
Пишейки на Ц не видях нещо което значително ми спестява от ниското ниво наконтролера, все пак работиш директно с регистрите и битовете от тях на цялата периферия и ядро.
Логиката да научиш асемблера на АВР за да те улесни при по големите контролери (неАВР) също не я разбирам. Единствено ако досега не си ползвал никакъв асемблер, без значение какъв.
Не приемай мнението ми за заяждане, просто времето винаги може да бъде използвано по удачно, но все пак си е твое!
:wink:


Сря Дек 16, 2009 8:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Ники написа:
Пишейки на Ц не видях нещо което значително ми спестява от ниското ниво наконтролера, все пак работиш директно с регистрите и битовете от тях на цялата периферия и ядро. :wink:


Интересено пък, каква е тогава ползата от С-то? Пиша само на асемблер за малки моторолски процесори и за съжаление не мога да помогна на @michev. Веднъж се опитах да мина С и се отказах - не видях никакъв смисъл. Вярно, има всякаква аритметика, но прецених, че само за това не си струва. Все пак на асемблер мога да държа под контрол пространството и времето. Поне за мене това е по-ценно.

Май пак се почна. :)

_________________
Две плюс две е приблизително равно на четири. Факт!


Сря Дек 16, 2009 9:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Яну 20, 2009 11:54 pm
Мнения: 11338
Местоположение: "Занзибар"
Мнение 
Как управляваш нещо в реално време с програма която не знаеш за колко се изпълнява? :twisted:


Сря Дек 16, 2009 10:02 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
sthx прочетох че пишеш за моторолски процесори, и ще попитам единствен ли асемблер ползваш, и колко модификации на процесора ползваш?
От цитата, който си извадил, ще наблегна на две думички: ниското ниво.

Не съм спИциалиста който ще проповядва против едното или другото, мен няма кой да ме агитира да се връщам обратно при асемблера, избрал съм как и на какво да пиша, мнението ми е че има защо С да е дори с малко по добре :)


Сря Дек 16, 2009 10:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Съб Юни 24, 2006 8:25 pm
Мнения: 2292
Мнение 
Ники написа:
sthx прочетох че пишеш за моторолски процесори, и ще попитам единствен ли асемблер ползваш, и колко модификации на процесора ползваш?

Не съм спИциалиста който ще проповядва против едното или другото, мен няма кой да ме агитира да се връщам обратно при асемблера, избрал съм как и на какво да пиша, мнението ми е че има защо С да е дори с малко по добре :)


Да и аз не искам никого да агитирам и да твърдя , че по-добро решения от асемблера няма. Зависи от конкретния случай, история и т.н. Сега се сещам за друго предимство на С - ако човек трябва да пише за много видове процесори.
Съзнателно избягвам да ползвам други фамилии, както и да ограничавам номенклатурата. Даже и за снабдяването е по-добре. Текущо ползвам 6-7 вида процесори с тенденция да станат 2-3. Конкретно на въпроса за фамилиите- 6800, HC11,HC08, HCS08.
Всъщност аз зададох въпрос (а не критика) като към човек, който е работил и на С и на Асемблер и пак ще го повторя: Какви са съществените предимства на С?

_________________
Две плюс две е приблизително равно на четири. Факт!


Сря Дек 16, 2009 10:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение 
Ники написа:
Аз също се занимавам повече като хоби с контролерите отколкото професионално.
...
Логиката да научиш асемблера на АВР за да те улесни при по големите контролери (неАВР) също не я разбирам.
...
:wink:

Никъде не съм споменавал, че по - големите контролери няма да са АВР :) . В момента ме чакат 2 бройки atxmega128a1 (те ще са следващата серия за изучаване)


Сря Дек 16, 2009 10:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
sthx написа:
Какви са съществените предимства на С?


А какви са съществените предимства на асемблера ? 8)

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Дек 17, 2009 4:51 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение 
Айде стига сте тролили бе :D .

Какви са предимствата на *някои* асемблери, както и че няма такова нещо като "асемблер"
съм писал повече от веднъж, който е искал да разбере да го е разбрал 100 пъти :) .

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Чет Дек 17, 2009 5:39 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 29 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни