Asembler x86/Zaawansowana architektura: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Kj (dyskusja | edycje)
Doles (dyskusja | edycje)
Nie podano opisu zmian
Linia 32:
*<font color ="green">P </font>- (ang. Semgnet-Present Flag) jeśli ta flaga jest równa 0 to dany segment nie jest w ogóle w pamięci operacyjnej, czyli jest odłożony na dysku twardym w postaci pliky wymiany ( za ten mechanizm odpowiada pamięć wirtualna).
*<font color ="green">D</font> lub <font color ="green">B</font> - flaga nazywana D lub w zależności od tego czy dany segment jest segmentem kodu czy danych. Znaczenie tego pola zależy ściśle od kontekstu w jakim został użyty.
**<font color="green">D</font> - Ta flaga w deskryptorze segmentu kodu mówi nam o "szerokości stosu". Jeśli flaga jest wyzerowana, szerokość stosu wynosi 16 bit (czyli ESP jest inkrementowany i dekrementowany o 2 bajty). Jeśli jest ustawiona na 1, szerokość wynosi 32 bity (analogicznie ESP rośnie lub maleje o 4 bajty).
**<font color="green">B</font> - Ta flaga determinuje maksymalny adres który może wskazywać ESP. Jeśli flaga jest wyczyszczona, wartość adresu jest 16 bitowa (zatem maksymalny adres to 0FFFFh). W przeciwnym wartość wynosi 32 bity ( maksymalny adres równy 0FFFFFFFFh).
 
{{TODO|Tutaj muszę sprawdzić w manualach Intela co jest napisane o tym polu bo nie mam zielonego pojęcia co ono oznaczało.}}
*<font color ="green">AVL</font> - pole które może używać dany system operacyjny ale nie musi tego robić, przykładowo Linuks ignoruje te pole.
{{TODO|Tutaj muszę sprawdzić w manualach Intela co jest napisane o tym polu bo nie mam zielonego pojęcia co ono oznaczało.}}
 
{{TODO|Tak samo jak z poprzednim}}
Co musi zrobić system operacyjny aby uzyskać adres liniowy z adresu logicznego ? Dla przykładu mamy wcześniejszy adres logiczny 0xc00d:1001. Najpierw brana jest część 0xC00D. Ineks z selektora segmentu jest pomnożony przez 8 (ponieważ taką długość w bajtach ma deskryptor segmentu). Do tej liczby dodawana jest wartość Base z deskryptora segmentu. Odpowiedni Deskryptor segmentu system operacyjny bierze z GDT lub LDT a to zaś wybiera na podstawie wartości pola TI w selektorze. Po zsumowaniu na sam koniec dodawana jest wartość offsetu z naszego adresu logicznego czyli 0x1001.
Poniżej znajduje się rysunek pokazujący jak powstaje adres liniowy: