Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

оптимизация на асемблерски код
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=7394
Страница 1 от 2

Автор:  michev [ Сря Дек 16, 2009 11:50 am ]
Заглавие:  оптимизация на асемблерски код

Здравейте.
Преди седмица, 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 6:32 pm ]
Заглавие: 

имаш ли сериозна нужда от асемблер та си губиш времето с него?

Автор:  michev [ Сря Дек 16, 2009 6:53 pm ]
Заглавие: 

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

Автор:  head_up [ Сря Дек 16, 2009 6:59 pm ]
Заглавие: 

абе и аз бях като тебе - на максимално ниско ниво да ми харесва да шляпам, ама ще установиш че за нещо по-голямо да пишеш така си е.... извратено. рядко се налага да дописваш на асмблер за повечето контролери, който имат и свястен Ц компилатор за тях, а то повечето са такива, тъй че не е особенно ползотворно занимание. ама за спорта не е лошо :) а ти явно за това го правиш, така че забавлявай се, пък ако от хоби стане професия - тогава ще ти е от полза понякога. тамън ще научиш и Ц-то, щото дявола ще те ръчка към него :P

Автор:  Wise [ Сря Дек 16, 2009 7:13 pm ]
Заглавие: 

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

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

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

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

Автор:  bateAz [ Сря Дек 16, 2009 7:30 pm ]
Заглавие: 

Много хубаво е да се започне с асемблер. Без това никога няма да добиеш представа какво всъщност прави контролера. След време, като пропишеш да C, ще добиеш навика от време на време да поглеждаш компилатора какво реално е направил и оттам да си правиш изводи как по-оптимално да ползваш езика.

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

Автор:  michev [ Сря Дек 16, 2009 8:22 pm ]
Заглавие: 

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

Автор:  Ники [ Сря Дек 16, 2009 8:44 pm ]
Заглавие: 

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

Автор:  sthx [ Сря Дек 16, 2009 9:43 pm ]
Заглавие: 

Ники написа:
Пишейки на Ц не видях нещо което значително ми спестява от ниското ниво наконтролера, все пак работиш директно с регистрите и битовете от тях на цялата периферия и ядро. :wink:


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

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

Автор:  bongo_x2 [ Сря Дек 16, 2009 10:02 pm ]
Заглавие: 

Как управляваш нещо в реално време с програма която не знаеш за колко се изпълнява? :twisted:

Автор:  Ники [ Сря Дек 16, 2009 10:02 pm ]
Заглавие: 

sthx прочетох че пишеш за моторолски процесори, и ще попитам единствен ли асемблер ползваш, и колко модификации на процесора ползваш?
От цитата, който си извадил, ще наблегна на две думички: ниското ниво.

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

Автор:  sthx [ Сря Дек 16, 2009 10:13 pm ]
Заглавие: 

Ники написа:
sthx прочетох че пишеш за моторолски процесори, и ще попитам единствен ли асемблер ползваш, и колко модификации на процесора ползваш?

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


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

Автор:  michev [ Сря Дек 16, 2009 10:30 pm ]
Заглавие: 

Ники написа:
Аз също се занимавам повече като хоби с контролерите отколкото професионално.
...
Логиката да научиш асемблера на АВР за да те улесни при по големите контролери (неАВР) също не я разбирам.
...
:wink:

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

Автор:  [ Чет Дек 17, 2009 4:51 am ]
Заглавие: 

sthx написа:
Какви са съществените предимства на С?


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

Автор:  tgi [ Чет Дек 17, 2009 5:39 am ]
Заглавие: 

Айде стига сте тролили бе :D .

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

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/