Re: Jak to v C++ napsat líp?
Martin Záruba
swz na volny.cz
Čtvrtek Srpen 31 13:40:11 CEST 2023
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á.
Martin Záruba
Dne 31.8.2023 v 13:21 Jan Waclawek napsal(a):
> 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:
>
>> 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
> 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 jehttps://sourceware.org/binutils/docs/as.html#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:
>
>> d:\PROGRA~1\Atmel\AVRTools\Wavr-gcc-8.0_2017-07-19_mingw32\bin\avr-objdump -d -h -S espp2.elf >espp2.lss
> co zdisasembluje uz zlinkovany binar (espp2.elf). Navod tu
> https://sourceware.org/binutils/docs/binutils.html#objdump
>
> 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 ---------------
>
>> 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):
>>> 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
>>>
> _______________________________________________
> HW-list mailing list - sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230831/363cf2f2/attachment.htm>
Další informace o konferenci Hw-list