Próbuję uczyć się języka asemblerowego i potrzebuję wyjaśnienia czegoś. Proszę mnie poprawić, jeśli nie mam racji, ponieważ nie wiem zbyt wiele na temat montażu.Alokacja pamięci zespołu
Wszystkie samouczki, które oglądam, mają zmienne programów montażowych przypisanych do adresu pamięci, takiego jak 0x0000
, i rozumiem, że należy ręcznie przypisać adresy pamięci w zespole, ale skąd wiadomo, jakiego adresu użyć?
Oczywiście ma sens rozpoczęcie od najniższego możliwego adresu pamięci, ale co, jeśli przypisana zmienna jest większa niż pamięć dostępna pod numerem 0x0000
? Czy zmienna, o której mowa, przejdzie na 0x0001
lub 0x0002
? Gdyby tak było, nie zepsułoby to innych zmiennych przypisanych przestrzeniami o podobnej numeracji (czy nie powinno się ich przypisywać tak blisko)?
Jeśli mam dwa programy napisane w zespole uruchomionym w tym samym czasie (w nowoczesnym systemie operacyjnym) i użyłem tych samych adresów pamięci w obu programach, czy jeden program będzie w konflikcie z drugim, czy system operacyjny po prostu przypisze dostępny adres pamięci niezależnie od tego, co faktycznie zapisano w programie?
Wszelkie informacje na ten temat są mile widziane.
Dzięki za szczegółową odpowiedź! W ostatniej części odpowiedzi, w jaki sposób dokładnie obliczyć, ile miejsca potrzeba na każdy bit danych? ręczne obliczanie setek zmiennych dla programu wydaje się niewykonalne. Używając swoich słów, jak to "wyłożyć"? – ubiquibacon
Nigdy nie pracowałem z montażem w dużych projektach, ale heurystyka zalecana w mojej klasie OS polegała na sortowaniu zmiennych według wielkości, a następnie umieszczaniu najmniejszych na najniższych adresach pamięci. Nie zawsze jest to najlepszy układ - możesz być w stanie dopasować małe typy danych pomiędzy dużymi. Powinieneś być w stanie określić na podstawie typu zmiennej, jaka ilość pamięci jest potrzebna - zapoznaj się z dokumentacją dla swojego języka asemblerowego. Pamiętaj, że zmienna zajmuje taką samą ilość pamięci przez cały czas trwania twojego programu. Nie może "rosnąć". Właśnie dlatego powstają przepełnienia. –
Świetna odpowiedź, tylko jedna korekta. Prawidłowe wyrównywanie danych nie polega na oszczędzaniu miejsca, tak jak i całej przyległej pamięci. Ma to związek ze sposobem mapowania magistrali danych do pamięci. Pierwsze 8 bitów rozpoczyna się od adresu 0, kolejne 8 bitów łączy się z adresem 1. Oznacza to, że 16-bitowa liczba całkowita zaczynająca się od adresu 0 może być odczytywana w jednym czytaniu, ponieważ wykorzystuje obie strony magistrali danych. Jeśli jednak 16-bitowa liczba całkowita zaczyna się od 1, teraz musi wykonać dwa odczytu, aby uzyskać całą liczbę całkowitą. W przypadku 32-bitowych liczb całkowitych powinny one zaczynać się od adresów podzielnych przez 4 z tego samego powodu. – Despertar