Последние записи
- Сделать авторизацию пользователя в программе
- Сделать границы компонента edit – жирными?
- Как настроить адрес без указания на index.php?
- Чтение из Excel и валидация. Можно ли как-то ускорить данный процесс?
- Загрузить файл из папки с программой
- Компьютеры для бухгалтера и дизайнера. В чём разница?
- Удалить все повторения в строке
- Как в treeview узнать индекс узла по которому был click?
- Исходник программы «азбука Морзе»
- Рассылка. Выпуск 139
20th
Авг
Регистры и смещение
Posted by Chas under Топик-обзор
Смещение – это адрес в памяти, относительно точки отсчета. В данном случае точка отсчета не начало памяти, а адрес начала сегмента.
Эти извращенства были придуманы когда компьютеры были большими, а память маленькой. При таком раскладе команда занимает меньше места (адрес получается более коротким, а память-то совсем маленькая), для поддержки всего этого есть регистр, хранящий адрес начала сегмента, процессор сам заботится о том, что бы приплюсовать (или сделать конкатенацию, смотря как там устроено) смещение к базе, при работе с памятью.
Ну, сегментная модель памяти осталась в прошлом (и слава богу). В Win32 используется плоская модель памяти – это когда вся память представлена одним большим массивом из байт. Соответственно, многие из сегментных сегментов потеряли смысл и сегодня они эквивалентны (указывают на одну и ту же область памяти).
Очень грубо понять сегмент и смещение можно так: сегмент – это переменная типа массив 0..65535 из байт (к примеру). Смещение – это индекс в массиве. Чтобы обратиться к ячейке памяти (т.е. элементу массива) вам нужно взять адрес начала массива (сегмент) и прибавить к нему индекс (смещение). Т.е. когда вы говорите просто “индекс 15″ – вы не можете узнать, про какой байт идёт речь, пока вы не скажете от какого массива этот индекс. Иными словами, индекс имеет смысл, только будучи приписан к массиву (”индекс относителен к началу массива”). Аналогично и смещение задаёт сдвиг от начала сегмента.
Связано это с тем, что 16-ти разрядное число не может адресовать много памяти. Зато два числа (сегмент + смещение) дают большую свободу. Эта модель – не более, чем обходной путь. В 32-х разрядном мире смысла в этих изворотах нет.
Ну а параграф – это просто 16 байт.
Лучше всего это понять, рисуя на бумажке. Неужто в книге нет иллюстраций?
Вообще, эту информацию можете смело пропустить – я не думаю, кто она хоть как-то применима в мире Win32, если только вы не станете писать приложения под Windows 3.1.
P.S. Возможно, вам будет интересно.
Интересная тема на форуме, присоединится к обсуждению

