|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 9:41 am
оптимизация на асемблерски код
| Автор |
Съобщение |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 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 |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Ами то по твойта логика, погледнато през моите очи - и с контролерите като цяло си губя времето, понеже се занимавам с тях през свободното си време, не професионално
Конкретна причина да седна да уча асемблер - няма. Просто реших че, докато не изучва из основи мегите, няма да се прехвърля на нещо по голямо. Съответно ми се стори доста лесно изучаването им по подробно, чрез писане на асемблер. Допада ми също че, една и съща програма писана на Ц и на асемблер има различна големина (понякога в пъти) в полза на асемблера. И не на последно място - допада ми работата с контролера на максимално ниско ниво.
|
| Сря Дек 16, 2009 6:53 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
абе и аз бях като тебе - на максимално ниско ниво да ми харесва да шляпам, ама ще установиш че за нещо по-голямо да пишеш така си е.... извратено. рядко се налага да дописваш на асмблер за повечето контролери, който имат и свястен Ц компилатор за тях, а то повечето са такива, тъй че не е особенно ползотворно занимание. ама за спорта не е лошо  а ти явно за това го правиш, така че забавлявай се, пък ако от хоби стане професия - тогава ще ти е от полза понякога. тамън ще научиш и Ц-то, щото дявола ще те ръчка към него 
|
| Сря Дек 16, 2009 6:59 pm |
|
 |
|
Wise
Ранг: Форумен бог
Регистриран на: Нед Дек 19, 2004 6:26 pm Мнения: 1628 Местоположение: Сливен
|
md2:
dec temp;
tst temp;
breq md2end;
rjmp md2;
md2end:
Не отчайвайте човека де.......
Асемблерчето си е като първата любов
md2:
dec temp
brne md2
md2end:
......................
не съм гледал всичко, но това ми се набива в очите
давай смело нататък!

|
| Сря Дек 16, 2009 7:13 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Много хубаво е да се започне с асемблер. Без това никога няма да добиеш представа какво всъщност прави контролера. След време, като пропишеш да C, ще добиеш навика от време на време да поглеждаш компилатора какво реално е направил и оттам да си правиш изводи как по-оптимално да ползваш езика.
Така че, дерзай! 
|
| Сря Дек 16, 2009 7:30 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Много си прав @Wise, окъкал съм всички бранчове
@head_up, чувам че, сносните компилатори са платени, а аз лично избягвам да ползвам излекувани такива  . Определено гцц-то което идва с WinAVR не генерира компактен код.
@bateAz, точно на обратно почнах - първо Ц, та после асемблер. Ц-то като език не ми е проблем, тъй като на него прописах преди малко повече от 10 години  , но за ПЦ
Проблемът ми със Ц идва от не знанието на тънкостите при писане на програми за МЦУ-та(стават тлъсти  ). Съответно за да се "светна" сам, реших да пробвам асемблера.
|
| Сря Дек 16, 2009 8:22 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
Аз също се занимавам повече като хоби с контролерите отколкото професионално.
Съгласен съм и нееднократно гцц ме е дразнило с генерирания код, но познавам асемблера до степен само да преглеждам кода при проблеми в изпълнението или при неразумни обеми за някоя Ц-конструкция.
Важното е програмата да работи достатъчно стабилно в зададениете й условия. Естествено ако ще се правят някакви оптимизирани фрагменти и С прави само глупости, асемблера няма алтернатива...
Пишейки на Ц не видях нещо което значително ми спестява от ниското ниво наконтролера, все пак работиш директно с регистрите и битовете от тях на цялата периферия и ядро.
Логиката да научиш асемблера на АВР за да те улесни при по големите контролери (неАВР) също не я разбирам. Единствено ако досега не си ползвал никакъв асемблер, без значение какъв.
Не приемай мнението ми за заяждане, просто времето винаги може да бъде използвано по удачно, но все пак си е твое!

|
| Сря Дек 16, 2009 8:44 pm |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
Интересено пък, каква е тогава ползата от С-то? Пиша само на асемблер за малки моторолски процесори и за съжаление не мога да помогна на @michev. Веднъж се опитах да мина С и се отказах - не видях никакъв смисъл. Вярно, има всякаква аритметика, но прецених, че само за това не си струва. Все пак на асемблер мога да държа под контрол пространството и времето. Поне за мене това е по-ценно.
Май пак се почна. 
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Сря Дек 16, 2009 9:43 pm |
|
 |
|
bongo_x2
Ранг: Форумен бог
Регистриран на: Вто Яну 20, 2009 11:54 pm Мнения: 11338 Местоположение: "Занзибар"
|
Как управляваш нещо в реално време с програма която не знаеш за колко се изпълнява? 
|
| Сря Дек 16, 2009 10:02 pm |
|
 |
|
Ники
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 11:19 pm Мнения: 609
|
sthx прочетох че пишеш за моторолски процесори, и ще попитам единствен ли асемблер ползваш, и колко модификации на процесора ползваш?
От цитата, който си извадил, ще наблегна на две думички: ниското ниво.
Не съм спИциалиста който ще проповядва против едното или другото, мен няма кой да ме агитира да се връщам обратно при асемблера, избрал съм как и на какво да пиша, мнението ми е че има защо С да е дори с малко по добре 
|
| Сря Дек 16, 2009 10:02 pm |
|
 |
|
sthx
Ранг: Форумен бог
Регистриран на: Съб Юни 24, 2006 8:25 pm Мнения: 2292
|
Да и аз не искам никого да агитирам и да твърдя , че по-добро решения от асемблера няма. Зависи от конкретния случай, история и т.н. Сега се сещам за друго предимство на С - ако човек трябва да пише за много видове процесори.
Съзнателно избягвам да ползвам други фамилии, както и да ограничавам номенклатурата. Даже и за снабдяването е по-добре. Текущо ползвам 6-7 вида процесори с тенденция да станат 2-3. Конкретно на въпроса за фамилиите- 6800, HC11,HC08, HCS08.
Всъщност аз зададох въпрос (а не критика) като към човек, който е работил и на С и на Асемблер и пак ще го повторя: Какви са съществените предимства на С?
_________________ Две плюс две е приблизително равно на четири. Факт!
|
| Сря Дек 16, 2009 10:13 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
Никъде не съм споменавал, че по - големите контролери няма да са АВР  . В момента ме чакат 2 бройки atxmega128a1 (те ще са следващата серия за изучаване)
|
| Сря Дек 16, 2009 10:30 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
А какви са съществените предимства на асемблера ? 
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Чет Дек 17, 2009 4:51 am |
|
 |
|
tgi
Ранг: Форумен бог
Регистриран на: Нед Юни 10, 2007 2:22 pm Мнения: 6492 Местоположение: София
|
Айде стига сте тролили бе  .
Какви са предимствата на *някои* асемблери, както и че няма такова нещо като "асемблер"
съм писал повече от веднъж, който е искал да разбере да го е разбрал 100 пъти  .
_________________------------------- www.tgi-sci.com------------------- http://www.flickr.com/photos/didi_tgi/
|
| Чет Дек 17, 2009 5:39 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 7 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|