definice externi konstanty v C

Pavel Troller patrol@sinus.cz
Úterý Prosinec 4 15:08:49 CET 2007


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



Další informace o konferenci Hw-list