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.
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.
To dziala ale pod dosowymi kompilatorami borlanda :P
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
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.
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.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.