normalizacja wskaźników

0

Hey!

Czy może wie ktoś czym jest normalizacja wskaźników?

Pozdrawiam.

//czy tak trudno napisać sensowny temat? a nie "wskaźniki" - toż to nic nie mówi o treści! - M

0

Jasne... W trybie rzeczywistym procka segment zaczyna sie co 16 bajtów (paragraf)... Budowa wskaznika w tym trybie to segment:offset. Wskaznik znormalizowany to wskaźnik, w którym cześc offset ma wartość mniejszą niż 16 (0x10).

przykład (te same wskazania):

nie normalizowany - normalizowany
0xa000:0x1234 - 0xa123:0x0004

Jak widać w przykładzie (segment pamieci vga) normalizacje nie jest potrzebna do adresowania, a jedynie do porownywania wskazań adresowych. Przy porównaniu wskazniki z przykładu program uzna za różne (bo tak jest), mimo ze oba wskazuja na ten sam adres.

Zeby porównać ze sobą adresy w trybie rzeczywistym i pominąc problem mozliwych mutacji adresowania trzeba przeliczyć wskazanie na adres liniowy. Segment przesunać w lewo o 4 lub przemnożyć przez 16 i dodać offset. Każde mozliwe adresowanie da taki sam adres liniowy. Mając 2 takie adresy można je swobodnie porównać. Mając adres liniowy można uzystać wskaznik normowany:

unsigned s=0xa000;
unsigned o=0x1234;
//adresy rzeczywiste ():
void far* nie_normowany=(void far*)((unsigned long)(s<<16|o));
unsigned long linaddr=(s<<4)|o;
//adresy normowane:
s=linaddr>>4;
o=linaddr&0x0f;
void far* normowany=(void far*)((unsigned long)(s<<16|o));
if(normowany==nie_normowany)printf("ten napis sie nie wyswietli");

1 użytkowników online, w tym zalogowanych: 0, gości: 1