<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Arial">Moc děkuji, pozkoumám to, dal jste si velikou
        práci s tím mi to popsat. Asi to nutně nepotřebuji, ale moc mě
        to zajímá.</font><br>
    </p>
    <pre class="moz-signature" cols="72">Martin Záruba</pre>
    <div class="moz-cite-prefix">Dne 31.8.2023 v 13:21 Jan Waclawek
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:PC195202308311321220471bac23b2d@wekPC">
      <pre class="moz-quote-pre" wrap="">Ja neviem, nepouzivam Arduino ani jeho IDE. Kedysi som sa snazil pochopit,
co presne pocas prekladu robi, ale bolo to davno a nepochopil som to...

V principe su dve cesty. 

1.
To, co som ukazal tu, je ta horsia a pravdepodobne s Arduinom aj tazsie
realizovatelna (ledazeby na to bolo niekde schovane nejake klikadlo alebo
riadok do ktoreho sa daju napisat dodatocne "elementy" ktore sa pridaju do
prikazoveho riadku, ktorym sa vola avr-gcc resp. avr-g++). Ide o to, ze z
C/C++ sa podstate preklada do presne takeho isteho assembleru ako na tych
salovych pocitacoch, takze potom sa spusti assembler (ako program co z
textu urobi ciselka) a ten ma moznost ako vedlajsi produkt vypisat takyto
listing. Je to na trochu dlhsie rozpravanie, ale radsej ukazem, ako to
robim: taketo jednoduche testovacie programy prekladam takymto prikazovym
riadkom:

</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">d:\PROGRA~1\Atmel\AVRTools\Wavr-gcc-8.0_2017-07-19_mingw32\bin\avr-gcc -Os -DF_CPU=14745600UL -mmcu=atmega2561 -Wa,-adhlns=espp2.lst -Wl,-Map=espp2.map,--cref -o espp2.elf espp2.cpp
</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">
to prve je len volanie programu avr-gcc s explicitne uvedenou celou cestou;
potom nasleduje prepinac pre nastavenie optimalizacie (-Os).

Prepinac -DF_CPU=14745600UL je uplne ekvivalentny tomu, ako ked sa na
zaciatku kazdeho prekladaneho suboru napise
#define F_CPU 14745600UL
je to treba napr. pre <delay.h>. 

-mmcu=atmega2561 je na prvy pohlad jasne, je to nastavenie cieloveho mcu;
ale v skutocnosti sa pod tymto schovava viacero veci a rozpravanie o nich
by zabralo velmi vela casu
[reklama] (trosicka z toho rozpravania je aj v tej mojej knihe, ale straca
sa to medzi ostatnymi vecami) [/reklama].

Potom nasleduje presne to, o com hovorim, -Wa - co nasleduje za ciarkou je
jednoducho odovzdane pri volani assembleru, a -a je pre assembler prepinac
"vytvor listing", popis je <a class="moz-txt-link-freetext" href="https://sourceware.org/binutils/docs/as.html#a">https://sourceware.org/binutils/docs/as.html#a</a> .

Za tym nasleduje -Wl, to sa zase odovzdava linkeru, a konkretne tieto
prepinace znamenaju -Map - vytvor mapfile, --cref - do mapfile uloz
krizove referencie (ak by ste si ten mapfile vytvorili s a bez --cref, tak
by ste videli rozdiel - toto moze byt uzitocne pri nejakom nahanani
problemu typu "odkial sa mi tu zobrala tato funkcia, a preco sa nepouzije
moja", ked sa linkuju rozne kniznice).

-o je prepinac, za ktorym nasleduje meno vystupneho suboru prekladu, tu je
to espp2.elf

Napokon nasleduje zoznam zdrojovych textov, tu je len jeden, espp2.cpp.

Problem s tym listingom z assembleru je ten, ze to je vysledok suroveho
prekladu pred linkovanim, t.j. nie su v nom vidiet skutocne adresy - tie
su nahradzovane nulami. Ale pre niekoho je ten listing citatelnejsi resp.
lahsie sa v nom mozu nachadzat niektore veci.

2. Druha cesta, ktora je asi v pripade Arduina priechodnejsia, je po
preklade na vysledny xxx.elf pustit nieco taketo:

</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">d:\PROGRA~1\Atmel\AVRTools\Wavr-gcc-8.0_2017-07-19_mingw32\bin\avr-objdump -d -h -S espp2.elf >espp2.lss
</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">
co zdisasembluje uz zlinkovany binar (espp2.elf). Navod tu
<a class="moz-txt-link-freetext" href="https://sourceware.org/binutils/docs/binutils.html#objdump">https://sourceware.org/binutils/docs/binutils.html#objdump</a>

Aby fungovalo -S (t.j. ze sa vkladaju riadky zo zdrojaku do disasm), je pri
preklade potrebne pouzit prepinac typu -g3 (neviem presne ktory, ale -g3
by mal fungovat). Potom ten xxx.lss obsahuje (okrem inych veci) toto:

int main(void) {
  A[0] = ('A' << 8) | 'B';
 112:   82 e4           ldi     r24, 0x42       ; 66
 114:   91 e4           ldi     r25, 0x41       ; 65
 116:   90 93 01 02     sts     0x0201, r25
 11a:   80 93 00 02     sts     0x0200, r24
  A[1] = ('C' << 8) | 'D';
 11e:   84 e4           ldi     r24, 0x44       ; 68
 120:   93 e4           ldi     r25, 0x43       ; 67
 122:   90 93 03 02     sts     0x0203, r25
 126:   80 93 02 02     sts     0x0202, r24
 12a:   ff cf           rjmp    .-2             ; 0x12a <main+0x18>


wek




----- Original Message ---------------

</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">To je pěkné. Já byl kdysi (no před 40ti lety) zvyklý programovat v 
Assembleru sálového počítače a o 20let později v Assembleru AT89C2051, 
takže i když jsou tyto instrukce jiné, snadno jsou mi pochopitelné, ale 
jak získat ten výpis? Pro mě je to Arduino značně okrajová záležitost, 
spíš hračka, která mě zajímá. Jde nějak donutit ArduinoIde k tomuto 
výpisu? nebo lze jej někde najít po překladu?

Martin Záruba

Dne 31.8.2023 v 11:25 Jan Waclawek napsal(a):
</pre>
        <blockquote type="cite">
          <pre class="moz-quote-pre" wrap="">Ved pisem, zavisi od rocnika gcc a optimalizacie. Pouzil som avr-gcc 8.0 z
roku 2017 a -Os a prelozilo mi to podla ocakavania, bez FLASH a bez nul:

   16 0000 81E4                 ldi r24,lo8(65)
   17 0002 92E4                 ldi r25,lo8(66)
   18 0004 9093 0000            sts A+1,r25
   19 0008 8093 0000            sts A,r24
   20 000c 83E4                 ldi r24,lo8(67)
   21 000e 94E4                 ldi r25,lo8(68)
   22 0010 9093 0000            sts A+2+1,r25
   23 0014 8093 0000            sts A+2,r24

</pre>
        </blockquote>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
    </blockquote>
  </body>
</html>