[8086] Adres fizyczny, para segment:offset

artmat
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 16 wrz 2014, o 14:15
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 20 razy

[8086] Adres fizyczny, para segment:offset

Post autor: artmat »

Witam
Pytanie dotyczy poprawności mojego rozumowania.
Mam podany adres fizyczny w postaci dziesiętnej np \(\displaystyle{ 20}\). Adres fizyczny obliczamy mnożąc wartość rejestru segmentowego przez \(\displaystyle{ 16}\) i następnie dodając offset. Zatem parę segment:offset charakteryzującą adres fizyczny \(\displaystyle{ 20}\) możemy przedstawić w postaci:
\(\displaystyle{ 1:4 \left( 1 \cdot 16 +4\right)}\)
Segmenty nie są rozłączne więc prawidłowa wydaje się też para:
\(\displaystyle{ 0:20 \left( 0 \cdot 16 +20\right)}\)
Czy otrzymane pary są poprawne ? Czy można zapisać ten adres fizyczny jeszcze za pomocą innych par segment:offset?
Ostatnio zmieniony 30 cze 2016, o 15:42 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[8086] Adres fizyczny, para segment:offset

Post autor: Afish »

A jak duży może być offset?
artmat
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 16 wrz 2014, o 14:15
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 20 razy

[8086] Adres fizyczny, para segment:offset

Post autor: artmat »

Hmm przeczytałem teraz o przesunięciu wewnątrz danego segmentu więc pewnie nie więcej niż 16, tak ?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[8086] Adres fizyczny, para segment:offset

Post autor: Afish »

Nie podałeś o jaką architekturę chodzi, więc mogę jedynie domyślać się, że tak.
artmat
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 16 wrz 2014, o 14:15
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 20 razy

[8086] Adres fizyczny, para segment:offset

Post autor: artmat »

Intel 8086
Czyli jedynym poprawnym rozwiązaniem jest :
\(\displaystyle{ 1:4 \left( 1 \cdot 16 +4\right)}\)
Czy dla większych adresów działa to tak samo czy wtedy jest większa ilość takich par?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[8086] Adres fizyczny, para segment:offset

Post autor: Afish »

Teraz jest konkret. Zatem zaglądamy do wiki:
Because of the way the segment address and offset are added, a single linear address can be mapped to up to 4096 distinct segment:offset pairs. For example, the linear address 08124h can have the segmented addresses 06EFh:1234h, 0812h:0004h, 0000h:8124h, etc. This could be confusing to programmers accustomed to unique
artmat
Użytkownik
Użytkownik
Posty: 64
Rejestracja: 16 wrz 2014, o 14:15
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 20 razy

[8086] Adres fizyczny, para segment:offset

Post autor: artmat »

Ok, ale dlaczego offset może tutaj być tak duży skoro kilka linijek wyżej ograniczyliśmy się tylko do offsetu o maksymalnej długości 16 ?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[8086] Adres fizyczny, para segment:offset

Post autor: Afish »

Właśnie mnie zapytałeś, dlaczego to Ty przyjąłeś ograniczenie do szesnastu. Nie podałeś na początku architektury, więc zapytałem o długość przesunięcia, a Ty w odpowiedzi podałeś \(\displaystyle{ 16}\).

Jeżeli zaś chodzi o adresowanie w 8086: adres wyznaczają dwie liczby szesnastobitowe, pierwszą (segment) mnoży się przez \(\displaystyle{ 16}\), następnie do wyniku dodaje się drugą (przesunięcie wewnątrz segmentu). W tej architekturze jak najbardziej dwie różne pary adresów mogą wskazywać (i bardzo często tak jest) na tę samą komórkę w pamięci.
ODPOWIEDZ