Отговори на тема  [ 10 мнения ] 
AVR - GCC - Assembler ? 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 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


кода на С
Код:
static unsigned long ddiv64on32(unsigned long dl)
{
   asm volatile( ...
   );
}


кода тук съм го спестил понеже така и така не се компилира, само да спомена че използвах други регистри за да не си пречиме с компилатора - а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


Вто Фев 07, 2012 2:52 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: AVR - GCC - Assembler ?
Тези линкове може да ти помогнат.
http://ibiblio.org/gferg/ldp/GCC-Inline ... HOWTO.html
http://www.ethernut.de/en/documents/arm-inline-asm.html

_________________
Мразя да мразя ...


Сря Фев 08, 2012 12:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: AVR - GCC - Assembler ?
Асемблирай го като отделен файл и го link-ни.
Целта на GCC inline асемблера е друга.


Сря Фев 08, 2012 3:43 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение Re: AVR - GCC - Assembler ?
Като начало си намерих чисто синтактична грешка, оправих я и се компилира само че:
Код:
asm volatile(   "UD1:   lsl r2"      "\n\t"
               "   rol r3"         "\n\t"
               "   rol r4"         "\n\t"
               "   rol r5"         "\n\t"
               "   rol r6"         "\n\t"
               "   rol r7"         "\n\t"
               "   rol r8"         "\n\t"
               "   rol r9"         "\n\t"                           
   );

се компилира в
Код:
asm volatile(   "UD1:   lsl r2"      "\n\t"
170:   22 0c          add   r2, r2
172:   33 1c          adc   r3, r3
174:   44 1c          adc   r4, r4
176:   55 1c          adc   r5, r5
178:   66 1c          adc   r6, r6
17a:   77 1c          adc   r7, r7
17c:   88 1c          adc   r8, r8
17e:   99 1c          adc   r9, r9

по принци изглежда вярно, но искам да не ми оптимизира моя код.


Сря Фев 08, 2012 4:51 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: AVR - GCC - Assembler ?
Затова ти казвам че идеята на inline asm е друга.

Конкретно да не ти закача кода - слагаш "__asm__ __volatile__ (...);".

Прави сметка че трябва правилно да му обясниш какво пипаш - регистри, флагове, памет.


Сря Фев 08, 2012 4:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: AVR - GCC - Assembler ?
woody за какво служи асемблера на GCC, ако не да си вкараш твои асм функции?

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Фев 08, 2012 6:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: AVR - GCC - Assembler ?
За малки фрагменти от функции, т.е. парчета които биват смесени с компилиран код, които да комуникират с останалото абстрактно представяне. Което води до оптимизации (вкл. пренареждане), необходимост от внимателно дефиниране на вход/изход/промени и т.н.

Най-прост пример - използване на специфична инструкция, която компилаторът не генерира. Пример - някоя DSP инструкция, или дори memory barrier.

Когато случаят е такъв като на Боби, удачното е външна асемблерска функция, която единствено гледа да си спази ABI-то. Най-малкото защото синтаксисът на GCC inline asm е различен за всяка архитектура, не от най-добре документираните, и като цяло добър източник на проблеми.


Сря Фев 08, 2012 7:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: AVR - GCC - Assembler ?
Мерси.
Все ми се струва, че ако има опция човек да си пише направо на асемблер в GCC-то ще е по-добре, но явно против това си има доста политически и други причини.

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Фев 08, 2012 7:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: AVR - GCC - Assembler ?
ike написа:
Мерси.
Все ми се струва, че ако има опция човек да си пише направо на асемблер в GCC-то ще е по-добре, но явно против това си има доста политически и други причини.


Мдаа, ето аз например съм изцяло против да се пише на асемблер. Причини мога да изброя много. Ама ти пък ми кажи за какво ти е тази опция да си пише асм?


Сря Фев 08, 2012 9:48 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: AVR - GCC - Assembler ?
ike написа:
woody за какво служи асемблера на GCC, ако не да си вкараш твои асм функции?


С инлайн асемблера не можеш да правиш асемблерски фукции. Целта му е да инжектираш код в С функция.

Разликата е огромна, особено при връската с останалия код. Функциите са ясно - там независимо дали са С или асемблер си има calling конвенция и ясно кой регистър кога и от кого се спасява или омазва. Но когато инжектираш код във вече същестуваща функция не може просто ей така да го пляснеш, Компилаторът трябва да знае твоя асемблерски фрагмент какво очаква на входа и какво изплюва/омазва на изхода.
Затова си има формат как да се указват тия неща. По-горе са ти дали линкове. В тоя форум също много пъти сме го обяснвали...

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


Сря Фев 08, 2012 10:05 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 31 госта


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

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