| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| AVR - GCC - Assembler ? http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9856 |
Страница 1 от 1 |
| Автор: | bobyk [ Вто Фев 07, 2012 2:52 pm ] | ||||||||||||||||||
| Заглавие: | AVR - GCC - Assembler ? | ||||||||||||||||||
Само аз ли си мисля, че дапишеш в GCC функция на асемблер си е мазохизъм? По начало ми трябва деление unsigned long long / unsigned long (по-точно res32b=const64b/var32b), ама GCC каства до unsigned long long и генерира огромен код ~4KB. Преписах/адаптирах си код на асемблер, тествах - ОК, но как да го набутам в основната ми програма. Контролера е tiny2313, изчетох достапримери и пак не успявам да го докарам. асемблер
кода на С
кода тук съм го спестил понеже така и така не се компилира, само да спомена че използвах други регистри за да не си пречиме с компилатора - а7..а0->r9..r2, b3..b0 битрябвало да си идва в r25..r22, t3..t0->r13..r10, t4->r16 дава ми make: *** [main.o] Error 1 което не ми помага. разгледах: http://www.mikrocontroller.net/articles ... 832_Bit.29 http://www.nongnu.org/avr-libc/user-man ... _reg_usage http://www.nongnu.org/avr-libc/user-man ... mbler.html http://www.nongnu.org/avr-libc/user-man ... e_asm.html |
|||||||||||||||||||
| Автор: | palavrov [ Сря Фев 08, 2012 12:02 pm ] |
| Заглавие: | Re: AVR - GCC - Assembler ? |
Тези линкове може да ти помогнат. http://ibiblio.org/gferg/ldp/GCC-Inline ... HOWTO.html http://www.ethernut.de/en/documents/arm-inline-asm.html |
|
| Автор: | woody [ Сря Фев 08, 2012 3:43 pm ] |
| Заглавие: | Re: AVR - GCC - Assembler ? |
Асемблирай го като отделен файл и го link-ни. Целта на GCC inline асемблера е друга. |
|
| Автор: | bobyk [ Сря Фев 08, 2012 4:51 pm ] | ||||||||||||||||||
| Заглавие: | Re: AVR - GCC - Assembler ? | ||||||||||||||||||
Като начало си намерих чисто синтактична грешка, оправих я и се компилира само че:
се компилира в
по принци изглежда вярно, но искам да не ми оптимизира моя код. |
|||||||||||||||||||
| Автор: | woody [ Сря Фев 08, 2012 4:58 pm ] |
| Заглавие: | Re: AVR - GCC - Assembler ? |
Затова ти казвам че идеята на inline asm е друга. Конкретно да не ти закача кода - слагаш "__asm__ __volatile__ (...);". Прави сметка че трябва правилно да му обясниш какво пипаш - регистри, флагове, памет. |
|
| Автор: | ike [ Сря Фев 08, 2012 6:48 pm ] |
| Заглавие: | Re: AVR - GCC - Assembler ? |
woody за какво служи асемблера на GCC, ако не да си вкараш твои асм функции? |
|
| Автор: | woody [ Сря Фев 08, 2012 7:15 pm ] |
| Заглавие: | Re: AVR - GCC - Assembler ? |
За малки фрагменти от функции, т.е. парчета които биват смесени с компилиран код, които да комуникират с останалото абстрактно представяне. Което води до оптимизации (вкл. пренареждане), необходимост от внимателно дефиниране на вход/изход/промени и т.н. Най-прост пример - използване на специфична инструкция, която компилаторът не генерира. Пример - някоя DSP инструкция, или дори memory barrier. Когато случаят е такъв като на Боби, удачното е външна асемблерска функция, която единствено гледа да си спази ABI-то. Най-малкото защото синтаксисът на GCC inline asm е различен за всяка архитектура, не от най-добре документираните, и като цяло добър източник на проблеми. |
|
| Автор: | ike [ Сря Фев 08, 2012 7:40 pm ] |
| Заглавие: | Re: AVR - GCC - Assembler ? |
Мерси. Все ми се струва, че ако има опция човек да си пише направо на асемблер в GCC-то ще е по-добре, но явно против това си има доста политически и други причини. |
|
| Автор: | relsys [ Сря Фев 08, 2012 9:48 pm ] | |||||||||
| Заглавие: | Re: AVR - GCC - Assembler ? | |||||||||
Мдаа, ето аз например съм изцяло против да се пише на асемблер. Причини мога да изброя много. Ама ти пък ми кажи за какво ти е тази опция да си пише асм? |
||||||||||
| Автор: | miro_atc [ Сря Фев 08, 2012 10:05 pm ] | |||||||||
| Заглавие: | Re: AVR - GCC - Assembler ? | |||||||||
С инлайн асемблера не можеш да правиш асемблерски фукции. Целта му е да инжектираш код в С функция. Разликата е огромна, особено при връската с останалия код. Функциите са ясно - там независимо дали са С или асемблер си има calling конвенция и ясно кой регистър кога и от кого се спасява или омазва. Но когато инжектираш код във вече същестуваща функция не може просто ей така да го пляснеш, Компилаторът трябва да знае твоя асемблерски фрагмент какво очаква на входа и какво изплюва/омазва на изхода. Затова си има формат как да се указват тия неща. По-горе са ти дали линкове. В тоя форум също много пъти сме го обяснвали... Специално за деленията и някои други операции трябва да знаеш, че те НЕ СА част от компилатора. Компилаторът не генерира нито една инструкция за която няма сорс. Когато му трябва деление или друго нещо за което няма инструкция той генерира извикване към стандартна функция. Ако на теб не ти харесва стандартната библиотека винаги може да я изключиш да не се линква автоматично (флаг: -nostdlib). При линкване ще видиш какви функции липсват и може да си ги напишеш сам. |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|