Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2010, 21:53   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Регистры и смещение.

Подумал, что этой теме самое место в этом разделе. Изучая Дельфи, я понял, что ничего путного из этого не получу, так как не знаю элементарной организации памяти и архитектуры компьютера... Начал изучать, тут же наткнулся на учебное пособие по ассемблеру, где описывается все низкоуровневое программирование и разбирается устройство компьютера... И вот не могу понять хоть убейте меня!
Цитата:
СЕГМЕНТЫ
___________________________________ _____________________________

Сегментом называется область, которая начинается на границе
параграфа, т.е. по любому адресу, который делится на 16 без остатка. Хотя
сегмент может располагаться в любом месте памяти и иметь размер до 64
Кбайт, он требует столько памяти, cколько необходимо для выполнения
программы. Имеется три главных сегмента:

1. С е г м е н т к о д о в. Сегмент кодов содержит машинные
команды, которые будут выполняться. Обычно первая выполняемая команда
находится в начале этого сегмента и операционная система передает
управление по адресу данного сегмента для выполнения программы.
Регистр сегмента кодов (CS) адресует данный сегмент.
2. С е г м е н т д а н н ы х. Сегмент данных содержит
определенные данные, константы и рабочие области, необходимые
программе. Регистр сегмента данных (DS) адресует данный сегмент.
3. С е г м е н т с т е к а. Стек содержит адреса возврата как
для программы для возврата в операционную систему, так и для вызовов
подпрограмм для возврата в главную программу. Регистр сегмента стека
(SS) адресует данный сегмент.

Еще один сегментный регистр, регистр дополнительного сегмента (ES),
предназначен для специального использования. На pис.1.2 графически
представлены регистры SS, DS и CS. Последовательность регистров и
сегментов на практике может быть иной. Три сегментных регистра содержат
начальные адреса соответствующих сегментов и каждый сегмент начинается на
границе параграфа.

___________________________________ ___________________________________ ____

г================¬
¦ D O S ¦
--------¬ ¦- - - - - - - - ¦ ¬
SS ¦ Адрес +->¦ Сегмент стека ¦ ¦
+ - - - + ¦- - - - - - - - ¦ ¦ Перемещаемые
DS ¦ Адрес +->¦ Сегмент данных ¦ ¦
+ - - - + ¦- - - - - - - - ¦ ¦ в памяти
CS ¦ Адрес +->¦ Сегмент кода ¦ ¦
L-------- ¦- - - - - - - - ¦ -
Сегментные ¦ ¦
регистры ¦ ¦
L================-
Память
___________________________________ ___________________________________ ____

Рис.1.2. Сегменты и регистры.


Внутри программы все адреса памяти относительны к началу cегмента.
Такие адреса называются смещением от начала сегмента. Двухбайтовое
смещение (16-бит) может быть в пределах от шест.0000 до шест.FFFF или от 0
до 65535. Для обращения к любому адресу в программе, компьютер складывает
адрес в регистре сегмента и смещение. Например, первый байт в сегменте
кодов имеет смещение 0, второй байт - 01 и так далее до смещения 65535.
В качестве примера адресации, допустим, что регистр сегмента данных
содержит шест.045F и некоторая команда обращается к ячейке памяти внутри
сегмента данных со смещением 0032. Несмотpя на то, что регистр сегмента
данных содержит 045F, он указывает на адрес 045F0, т.е. на границе
параграфа. Действительный aдрес памяти поэтому будет следующий:

Адрес в DS: 045F0
Смещение: 0032
-----
Реальный адрес: 04622

Каким образом процессоры 8086/8088 адресуют память в один миллион
байт? В регистре содержится 16 бит. Так как адрес сегмента всегда на
границе параграфа, младшие четыре бита адреса pавны нулю. Шест.FFF0
позволяет адресовать до 65520 (плюс смещение) байт. Но специалисты решили,
что нет смысла иметь место для битов, которые всегда равны нулю. Поэтому
адрес хранится в cегментном регистре как шест. nnnn, а компьютер полагает,
что имеются еще четыре нулевых младших бита (одна шест. цифра), т.е. шест.
nnnn0. Таким образом, шест.FFFF0 позволяет адресовать до 1048560 байт.
Если вы сомневаeтесь, то декодируйте каждое шест.F как двоичное 1111,
учтите нулевые биты и сложите значения для единичных бит.
Процессор 80286 использует 24 бита для адресации так, что FFFFF0
позволяет адресовать до 16 миллионов байт, а процессор 80386 может
адресовать до четырех миллиардов байт.
Можете понятно объяснить эту цитату? Буду очень благодарен...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 18.08.2010, 22:01   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Вот я понял про регистры, которые адресуют 4 сегмента а вот со строчки
Цитата:
Внутри программы все адреса памяти относительны к началу cегмента.
Тёмный лес. Что значит внутри программы? От куда блин берется это смещение?! Что это вообще?! За чем оно нужно?!
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 18.08.2010 в 22:13.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 18.08.2010, 22:26   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Смещение - это адрес в памяти, относительно точки отсчета. В данном случае точка отсчета не начало памяти, а адрес начала сегмента.

Эти извращенства были придуманы когда компьютеры были большими, а память маленькой. При таком раскладе команда занимает меньше места (адрес получается более коротким, а память-то совсем маленькая), для поддержки всего этого есть регистр, хранящий адрес начала сегмента, процессор сам заботится о том, что бы приплюсовать (или сделать конкатенацию, смотря как там устроено) смещение к базе, при работе с памятью.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 18.08.2010 в 22:36.
ROD вне форума Ответить с цитированием
Старый 18.08.2010, 22:55   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ну, сегментная модель памяти осталась в прошлом (и слава богу). В Win32 используется плоская модель памяти - это когда вся память представлена одним большим массивом из байт. Соответственно, многие из сегментных сегментов потеряли смысл и сегодня они эквивалентны (указывают на одну и ту же область памяти).

Очень грубо понять сегмент и смещение можно так: сегмент - это переменная типа массив 0..65535 из байт (к примеру). Смещение - это индекс в массиве. Чтобы обратиться к ячейке памяти (т.е. элементу массива) вам нужно взять адрес начала массива (сегмент) и прибавить к нему индекс (смещение). Т.е. когда вы говорите просто "индекс 15" - вы не можете узнать, про какой байт идёт речь, пока вы не скажете от какого массива этот индекс. Иными словами, индекс имеет смысл, только будучи приписан к массиву ("индекс относителен к началу массива"). Аналогично и смещение задаёт сдвиг от начала сегмента.

Связано это с тем, что 16-ти разрядное число не может адресовать много памяти. Зато два числа (сегмент + смещение) дают большую свободу. Эта модель - не более, чем обходной путь. В 32-х разрядном мире смысла в этих изворотах нет.

Ну а параграф - это просто 16 байт.

Лучше всего это понять, рисуя на бумажке. Неужто в книге нет иллюстраций?

Вообще, эту информацию можете смело пропустить - я не думаю, кто она хоть как-то применима в мире Win32, если только вы не станете писать приложения под Windows 3.1.

P.S. Возможно, вам будет интересно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 18.08.2010 в 23:00.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2010, 23:05   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Спасибо ребят, стало гораздо понятнее!
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 18.08.2010, 23:44   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
В Win32 используется плоская модель памяти - это когда вся память представлена одним большим массивом из байт.
Разве? Виндус (как и все современные ОС) реализует виртуальную память за счет разбиения на страницы (что-то типа усовершенствованного варианта сегментов). Это не плоская память, она попилена на куски, причем куски не обязаны, в момент выполнения программы, находится в оперативке. (только теперь адрес базы не постоянный, а может меняется, по мере того, как ОС гоняет страницы на винчестер и назад в память )
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 18.08.2010 в 23:48.
ROD вне форума Ответить с цитированием
Старый 19.08.2010, 00:05   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Видимо, мы просто используем разное определение понятия "плоская модель памяти".

В моём понимании она не исключает сказанного вами. Иными словами, говоря "плоская", я имею ввиду только виртуальное адресное пространство процесса (т.е. указатель - это одно значение, а не составное), а не то, что у него под капотом. Т.е. плоская - это когда один сегмент, содержащий в себе и данные и код.

А технически, да, 32-х разрядное плоское пространство имеет под собой страничную организацию.

Это, кстати, достаточно распространённая трактовка.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.08.2010, 00:09   #8
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
т.е. указатель - это одно значение, а не составное
Ну как же, смещение-то от начала сегмента у нас есть, а относительно какого сегмента это смещение? Нужен еще какой-то идентификатор сегмента (номер).
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 19.08.2010, 07:01   #9
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

Цитата:
Ну как же, смещение-то от начала сегмента у нас есть
От какого сегмента? Приведи пример

ROD
То про что говорит GunSmoker ещё называется "Несегментированная модель памяти" или просто FLAT - можно сказать даже, что это один большой сегмент в 4гига. Поищи Программирование для Windows NT. Александр Фролов, Григорий Фролов, Том 26, 1 часть. И зубрить 1 главу магической книги как Отче наш.

Цитирую:
Цитата:
Операционная система Microsoft Windows NT использует все возможности защищенного режима процессора, в частности, переключение задач и страничную адресацию. Схема преобразования адреса похожа на ту, что была применена в Microsoft Windows версии 3.1, однако есть много отличий.

Наиболее значительное - полный отказ от использования сегментированной модели памяти в 32-разрядных приложениях, к которой вы привыкли, создавая программы для MS-DOS и Microsoft Windows версии 3.1. В самом деле, используя 32-разрядное смещение, приложение может работать с памятью объемом 4 Гбайт без использования сегментных регистров процессора.
итд итп

Книга очень гудовая.

Последний раз редактировалось r9m; 19.08.2010 в 07:15.
r9m вне форума Ответить с цитированием
Старый 19.08.2010, 11:06   #10
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
От какого сегмента?
Оговорочка, я страницу имел ввиду.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регистры Волк Microsoft Office Excel 9 08.04.2009 16:07
Регистры символов rexec Microsoft Office Excel 11 02.02.2009 13:15
Регистры Манжосов Денис :) Помощь студентам 8 28.07.2008 12:48
Регистры RealSHELS Общие вопросы Delphi 3 28.03.2008 18:56
Регистры Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 10.02.2008 19:49