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