definice externi konstanty v C
Jaroslav Buchta
buchta@compelson.cz
Úterý Prosinec 4 15:29:09 CET 2007
IMHO si tohle prelozi kazdy prekladac jinak, optimalizace obcas dela
divy, konstanty se neloadujou jako konstanty, ale treba se udela inc/dec
z jine konstanty co uz je v registru atp. Nejlepsi napad IMHO bude se na
pozadovanou feature vykaslat a nejak to obejit kolem - treba tou funkci
;-)
-----Original Message-----
From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On
Behalf Of Pavel Troller
Sent: Tuesday, December 04, 2007 3:09 PM
To: HW-news
Subject: Re: definice externi konstanty v C
Hmm, možná jsem se nevyjádřil úplně přesně, ono je to někde "na půl
cesty", protože to není přímo immediate or, ale or PC-relativně získanou
hodnotou, kterou tam někam linker uloží. Ale je to už jen v jedné
instrukci, není na to potřeba další registr.... Ovšem nevím, zda to, co
umí C pro x86_64, bude umět C pro Z80 :-).
S pozdravem Pavel Troller
> Zdravím,
> myslím, že to C umí... Viz můj následující příklad:
> Aby to šlo zkompilovat, napsal jsem:
>
>
> extern const unsigned char mask;
> static char x = 0xaa;
>
> char test (void) {
>
> x |= mask;
>
> return x;
> }
>
> Zkompiloval:
> gcc -O99 -c test.c
>
> Vypsal object:
> objdump -d test.o
>
> test.o: file format elf64-x86-64
>
> Disassembly of section .text:
>
> 0000000000000000 <test>:
> 0: 0f b6 05 00 00 00 00 movzbl 0x0(%rip),%eax # 7
<test+0x7>
> 7: 0a 05 00 00 00 00 or 0x0(%rip),%al # d
<test+0xd>
> d: 88 05 00 00 00 00 mov %al,0x0(%rip) # 13
<test+0x13>
> 13: 0f be c0 movsbl %al,%eax
> 16: c3 retq
>
> Podle mého je tam přesně to, co chcete - první instrukce natahne
> proměnnou, druhá orne tou konstantou (ty nuly doplní linker aktuální
> hodnotou), třetí instrukce to vrátí zpátky...
>
> S pozdravem Pavel Troller
>
>
> > Spis to nedokazu dostatecne presne vysvetlit...
> >
> > Kompilator zkompiluje kod a necha tam nevyplnene odkazy na externi
> > funkce a promenne. Ty pak vyplni linker.
> >
> > Protoze potrebuju, aby linker doplnil i konstanty (v obj z asm
> > zdrojaku
> > to je v pohode), musim je nejak nadefinovat v C zdrojaku, aby vedel,
pro
> > jakou hodnotu ma v kompilovanem objektu nechat misto, jak ji
pouzit...
> > Po ruznych zkoumanich se priklanim k nazoru, ze toto v C asi udelat
nejde...
> >
> > Presto to zkusim jeste jednou vysvetlit:
> > reg |= 0x10;
> > vygeneruje cosi jako
> > in a,(reg)
> > or 0x10
> > out (reg),a
> >
> > Me zajima, jak prekladaci rict, ze hodnota 0x10 je definovana jinde
> > a
> > aby ji vyplnil az linker...
> >
> >
> > Hynek Sladky
> >
> >
> > Miroslav Sinko wrote:
> > > No tak asi nerozumiem... Protirecite si, lebo #define vam
> > > nevyhovuje z dovodu, ze to nema spracovavat kompilator, ale az
> > > linker a teraz opat pisete o kompilatore..
> > >
> > > Napiste prosim, co si predstavujete pod pojmom "externe definovana
> > > konstanta". Akoze kde definovana?
> > >
> > > Napriek tomu, ze teraz celkom nerozumiem otazke, skusim este 1
> > > tip. V nastaveniach projektu (GUI, makefile... podla prostredia, v
> > > ktorom
> > > programujete) sa spravidla da zadefinovat subor konstant platnych
pre
> > > projekt. Ale ono to nie je nic ine od toho, ako keby ste zapisali
to
> > > #define v headri, ktory je includovany vo vsetkych zdrojakoch
projektu.
> > >
> > > miro
> > >
> > >
> > > --- Hynek Sladky <econf@centrum.cz> wrote:
> > >
> > >
> > >>Jak uz jsem psal:
> > >>
> > >>extern unsigned char konst_maska;
> > >>
> > >>se pouzije jako odkaz na promennou, nikoli jako vlastni konstanta.
> > >>Tj. provede se cosi jako ld e,(konst_maska)
> > >>or e
> > >>
> > >>misto rovnou pouziti (cehoz bych chtel dosahnout):
> > >>or konst_maska
> > >>
> > >>Otazka tedy zustava: jak rict kompilatoru, ze dany identifikator
> > >>je
> > >>externe definovana konstanta (nikoli externe definovana konstantni
> > >>promenna)?
> > >
> > >
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz Hw-list@list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz Hw-list@list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list