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