Segmenty i offsety

0

Jak uzyskać offset i segment dla jakichś danych? Powiedzmy, że mam zmienną bufor i chcę mieć segment i offset jej początku. Jak mam te dane zdobyć?

Widziałem coś takiego jak FP_SEG(bufor) i FP_OFF(bufor) ale to nie działa.

0

To dziala ale pod dosowymi kompilatorami borlanda :P

0

Jak tam sobie chcesz... Ale w sumie zależy to od tego, czy wskaźniki masz bliskie (near* - to po prostu offset - wskaźnik 2-bajtowy), czy dalekie (far* 4- 4 bajty)... Wskaźniki bliskie występuja w trybie 16-bitowym (real mode) i są domyślne dla takich modeli jak tiny, small - dla wszystkiego, medium dla danych i compact dla kodu.

dla bliskich... (ten kawałek mozesz całkowicie pominąc, jeśli kompilujesz do PM - tam są domyślnie dalekie wskaźniki, o ile sam nie zadeklarujesz inaczej)

unsigned short=(unsigned int)(&danej)// sizeof(short)==2 <-always

dla dalekich... (sizeof(void*)==4)

unsigned short offset=((unsigned long)(&zmienna))&0xffff;
unsigned short offset=FP_OFF(&zmienna); // jednoznaczne z powyższym

unsigned short segment=((unsigned long)(&zmienna))>>16;
unsigned short offset=FP_SEG(&zmienna); // również jednoznaczne z powyższym

// tego unsigned przy long nie musi chyba być, nie jestem pewien ;)
// Tylko, to co napisał cepa... w PM nie ma podziału na segment i offset, bo adresy są liniowe.
// A na koniec przydługa i nudną teoria... Zapomiałes o & przy bufor ... FP_SEG(&bufor), chyba że bufor, to wskaźnik, wtedy dostaniesz adres wskazania

0

THX. Czyli, jak rozumiem, 4-bajtowy wskaźnik to daleki pointer, w którym dwa młodsze bajty to offset, a pozostałe dwa to segment.

SSOO znaczy się.

Jeśli się myle to mnie poprawcie.

Oznacza to też, że jeśli mam do jakiejś zmiennej podać adres w formacie SSOO to mogę po prostu przypisać jej wartość tego pointera.

0

SSOO znaczy się.

Tak, ale tylko dla real mode (16 bit/640k RAM/...), choć w pamięci te dane są od najmłodszego bajtu oOsS (o=offset & 0xff)

jeśli mam do jakiejś zmiennej podać adres w formacie SSOO to mogę po prostu przypisać jej wartość tego pointera

Nie bardzo rozumiem o co ci chodzi... Do zmiennej nie możesz dodać adresu (poza wskaznikami oczywista)... poza tym nie możesz jej przesunąć w pamięci (char a; &a=&a+...). Ale...

char* a;
char* b;
char* c;

c=a+b;
c=a-b;
c=a+(char*)(&b);
(char**)c=&a-&b;

To owszem zadziała.

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