|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 7:59 pm
|
Страница 1 от 1
|
[ 10 мнения ] |
|
| Автор |
Съобщение |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
 AVR - GCC - Assembler ?
Само аз ли си мисля, че дапишеш в GCC функция на асемблер си е мазохизъм? По начало ми трябва деление unsigned long long / unsigned long (по-точно res32b=const64b/var32b), ама GCC каства до unsigned long long и генерира огромен код ~4KB. Преписах/адаптирах си код на асемблер, тествах - ОК, но как да го набутам в основната ми програма. Контролера е tiny2313, изчетох достапримери и пак не успявам да го докарам. асемблер  |  |  |  | Код: .INCLUDE "tn2313def.inc"
.def a0 = r16 .def a1 = r17 .def a2 = r18 .def a3 = r19 .def a4 = r20 .def a5 = r21 .def a6 = r22 .def a7 = r23 .def b0 = r24 .def b1 = r25 .def b2 = r26 .def b3 = r27
.def t0 = r2 .def t1 = r3 .def t2 = r4 .def t3 = r5 .def t4 = r28
.CSEG
.ORG $00 RESET: RJMP START ; On Reset RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI RETI
START: LDI R16,LOW(RAMEND) OUT SPL,R16 ;16 7F 71 46 73 94 1E B7 LDI a0, 0xB7 LDI a1, 0x1E LDI a2, 0x94 LDI a3, 0x73 LDI a4, 0x46 LDI a5, 0x71 LDI a6, 0x7F LDI a7, 0x16 ;3E 80 00 LDI b0, 0x00 LDI b1, 0x80 LDI b2, 0x3E LDI b3, 0x00 RCALL UDIV32
;3E 80 00 LDI b0, 0x00 LDI b1, 0x80 LDI b2, 0x3E LDI b3, 0x00 RCALL UDIV32
MAINLOOP: NOP RJMP MAINLOOP ;****************************************************** ;* * ;* unsigned division 64/32 bit * ;* * ;****************************************************** ; a7..0 = a7..0 / b3..0 ; b3..0 = remainder ;cycle: 1423 UDIV32: CLR t0 CLR t1 CLR t2 CLR t3 LDI t4, 64 UDI1: LSL a0 ROL a1 ROL a2 ROL a3 ROL a4 ROL a5 ROL a6 ROL a7 ROL t0 ROL t1 ROL t2 ROL t3 CP t0, b0 CPC t1, b1 CPC t2, b2 CPC t3, b3 BRCS UDI2 SUB t0, b0 SBC t1, b1 SBC t2, b2 SBC t3, b3 INC a0 UDI2: DEC t4 BRNE UDI1 ; MOV b0, t0 ; MOV b1, t1 ; MOV b2, t2 ; MOV b3, t3 RET
|  |  |  |  |
кода на С кода тук съм го спестил понеже така и така не се компилира, само да спомена че използвах други регистри за да не си пречиме с компилатора - а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.29http://www.nongnu.org/avr-libc/user-man ... _reg_usagehttp://www.nongnu.org/avr-libc/user-man ... mbler.htmlhttp://www.nongnu.org/avr-libc/user-man ... e_asm.html
|
| Вто Фев 07, 2012 2:52 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: AVR - GCC - Assembler ?
_________________ Мразя да мразя ...
|
| Сря Фев 08, 2012 12:02 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
 Re: AVR - GCC - Assembler ?
Асемблирай го като отделен файл и го link-ни. Целта на GCC inline асемблера е друга.
|
| Сря Фев 08, 2012 3:43 pm |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
 Re: AVR - GCC - Assembler ?
Като начало си намерих чисто синтактична грешка, оправих я и се компилира само че: се компилира в по принци изглежда вярно, но искам да не ми оптимизира моя код.
|
| Сря Фев 08, 2012 4:51 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
 Re: AVR - GCC - Assembler ?
Затова ти казвам че идеята на inline asm е друга.
Конкретно да не ти закача кода - слагаш "__asm__ __volatile__ (...);".
Прави сметка че трябва правилно да му обясниш какво пипаш - регистри, флагове, памет.
|
| Сря Фев 08, 2012 4:58 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: AVR - GCC - Assembler ?
woody за какво служи асемблера на GCC, ако не да си вкараш твои асм функции?
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Сря Фев 08, 2012 6:48 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
 Re: AVR - GCC - Assembler ?
За малки фрагменти от функции, т.е. парчета които биват смесени с компилиран код, които да комуникират с останалото абстрактно представяне. Което води до оптимизации (вкл. пренареждане), необходимост от внимателно дефиниране на вход/изход/промени и т.н.
Най-прост пример - използване на специфична инструкция, която компилаторът не генерира. Пример - някоя DSP инструкция, или дори memory barrier.
Когато случаят е такъв като на Боби, удачното е външна асемблерска функция, която единствено гледа да си спази ABI-то. Най-малкото защото синтаксисът на GCC inline asm е различен за всяка архитектура, не от най-добре документираните, и като цяло добър източник на проблеми.
|
| Сря Фев 08, 2012 7:15 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: AVR - GCC - Assembler ?
Мерси. Все ми се струва, че ако има опция човек да си пише направо на асемблер в GCC-то ще е по-добре, но явно против това си има доста политически и други причини.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Сря Фев 08, 2012 7:40 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: AVR - GCC - Assembler ?
Мдаа, ето аз например съм изцяло против да се пише на асемблер. Причини мога да изброя много. Ама ти пък ми кажи за какво ти е тази опция да си пише асм?
|
| Сря Фев 08, 2012 9:48 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: AVR - GCC - Assembler ?
С инлайн асемблера не можеш да правиш асемблерски фукции. Целта му е да инжектираш код в С функция. Разликата е огромна, особено при връската с останалия код. Функциите са ясно - там независимо дали са С или асемблер си има calling конвенция и ясно кой регистър кога и от кого се спасява или омазва. Но когато инжектираш код във вече същестуваща функция не може просто ей така да го пляснеш, Компилаторът трябва да знае твоя асемблерски фрагмент какво очаква на входа и какво изплюва/омазва на изхода. Затова си има формат как да се указват тия неща. По-горе са ти дали линкове. В тоя форум също много пъти сме го обяснвали... Специално за деленията и някои други операции трябва да знаеш, че те НЕ СА част от компилатора. Компилаторът не генерира нито една инструкция за която няма сорс. Когато му трябва деление или друго нещо за което няма инструкция той генерира извикване към стандартна функция. Ако на теб не ти харесва стандартната библиотека винаги може да я изключиш да не се линква автоматично (флаг: -nostdlib). При линкване ще видиш какви функции липсват и може да си ги напишеш сам.
|
| Сря Фев 08, 2012 10:05 pm |
|
|
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|