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