definice externi konstanty v C
Pavel Troller
patrol@sinus.cz
Úterý Prosinec 4 15:02:37 CET 2007
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
Další informace o konferenci Hw-list