Последние записи
- Получение картинки с веб-камеры
- Скопировать определённый кусок image
- Сделать printscreen экрана и сохранить
- Написать программу, считывает с клавиатуры определенное колличество цифр, а на экран выводит сумму наибольшей цифры
- Создать системную, невидимую, только для чтения папку
- Какой яп и ide выбрать для кроссплатформенного программирования?
- Скачать html страницу в memo с помощью indy
- Как разорвать adsl соединение с интернетом?
- Как отключить/включить сетевое соединение?
- Передать состояние CheckBox
20th
Авг
Регистры и смещение
Posted by Chas under Топик-обзор
Смещение – это адрес в памяти, относительно точки отсчета. В данном случае точка отсчета не начало памяти, а адрес начала сегмента.
Эти извращенства были придуманы когда компьютеры были большими, а память маленькой. При таком раскладе команда занимает меньше места (адрес получается более коротким, а память-то совсем маленькая), для поддержки всего этого есть регистр, хранящий адрес начала сегмента, процессор сам заботится о том, что бы приплюсовать (или сделать конкатенацию, смотря как там устроено) смещение к базе, при работе с памятью.
Ну, сегментная модель памяти осталась в прошлом (и слава богу). В Win32 используется плоская модель памяти – это когда вся память представлена одним большим массивом из байт. Соответственно, многие из сегментных сегментов потеряли смысл и сегодня они эквивалентны (указывают на одну и ту же область памяти).
Очень грубо понять сегмент и смещение можно так: сегмент – это переменная типа массив 0..65535 из байт (к примеру). Смещение – это индекс в массиве. Чтобы обратиться к ячейке памяти (т.е. элементу массива) вам нужно взять адрес начала массива (сегмент) и прибавить к нему индекс (смещение). Т.е. когда вы говорите просто “индекс 15″ – вы не можете узнать, про какой байт идёт речь, пока вы не скажете от какого массива этот индекс. Иными словами, индекс имеет смысл, только будучи приписан к массиву (”индекс относителен к началу массива”). Аналогично и смещение задаёт сдвиг от начала сегмента.
Связано это с тем, что 16-ти разрядное число не может адресовать много памяти. Зато два числа (сегмент + смещение) дают большую свободу. Эта модель – не более, чем обходной путь. В 32-х разрядном мире смысла в этих изворотах нет.
Ну а параграф – это просто 16 байт.
Лучше всего это понять, рисуя на бумажке. Неужто в книге нет иллюстраций?
Вообще, эту информацию можете смело пропустить – я не думаю, кто она хоть как-то применима в мире Win32, если только вы не станете писать приложения под Windows 3.1.
P.S. Возможно, вам будет интересно.
Интересная тема на форуме, присоединится к обсуждению

